Как исправить анимацию перемещения изображения по X?IOS

Программируем под IOS
Ответить
Anonymous
 Как исправить анимацию перемещения изображения по X?

Сообщение Anonymous »

У меня есть такое приложение, как читалка. Когда я касаюсь правого края экрана, я перехожу на следующую страницу. Когда я касаюсь левого края экрана, я перехожу на предыдущую страницу. Мои страницы содержат изображения. Изображение полноэкранного размера и на 20 пикселей больше от одного из краев экрана. И когда я показываю страницу, я хочу, чтобы изображение перемещалось вправо от 0pt до 20pt или влево от 0pt до -20pt в зависимости от свойства imageDirection из файла json. Для этого я использую этот код:
контейнер чтения:

Код: Выделить всё

class ReaderController: UIViewController {

var pagesData = [PageData]()
var imageArray: [UIImage] = []
var index = Int()
var pageIndex: Int = -1

let pageContainer: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()

let pageViews: [PageLayout] = {
let view = [PageLayout(), PageLayout()]
view[0].translatesAutoresizingMaskIntoConstraints = false
view[1].translatesAutoresizingMaskIntoConstraints = false
return view
}()

override func viewDidLoad() {
super.viewDidLoad()

loadImages()
setupViews()
setupConstraints()

pageViews[0].index = index
pageViews[0].imageArray = imageArray
pageViews[1].index = index
pageViews[1].imageArray = imageArray
pageViews[0].pageIndex = pageIndex
pageViews[1].pageIndex = pageIndex

pageTransition(animated: false, direction: "fromRight")
}

func setupViews() {
pageContainer.addSubview(pageViews[0])
pageContainer.addSubview(pageViews[1])
view.addSubview(pageContainer)
}

func setupConstraints() {
pageContainer.topAnchor.constraint(equalTo: view.topAnchor, constant: 0.0).isActive = true
pageContainer.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0.0).isActive = true
pageContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0.0).isActive = true
pageContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0.0).isActive = true

pageViews[0].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[0].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[0].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[0].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true

pageViews[1].topAnchor.constraint(equalTo: pageContainer.topAnchor).isActive = true
pageViews[1].bottomAnchor.constraint(equalTo: pageContainer.bottomAnchor).isActive = true
pageViews[1].leadingAnchor.constraint(equalTo: pageContainer.leadingAnchor).isActive = true
pageViews[1].trailingAnchor.constraint(equalTo: pageContainer.trailingAnchor).isActive = true
}

func loadData(fileName: Any) -> PagesData {
var url = NSURL()
url = Bundle.main.url(forResource: "text", withExtension: "json")! as NSURL
let data = try! Data(contentsOf: url as URL)
let person = try! JSONDecoder().decode(PagesData.self, from: data)
return person
}

func loadImages() {
for imageIndex in 1...18 { imageArray.append(UIImage(named: "page\(imageIndex)")!) }
}

override func touchesBegan(_ touches: Set, with event: UIEvent?) {
for touch in touches {
if(touch.view == pageViews[0] || touch.view == pageViews[1]) {
let location = touch.location(in: view.self)
if view.safeAreaInsets.left > 30 {
if (location.x > self.view.frame.size.width - (view.safeAreaInsets.left * 1.5)) {
pageTransition(animated: true, direction: "fromRight")
} else if (location.x < (view.safeAreaInsets.left * 1.5)) {
pageTransition(animated: true, direction: "fromLeft")
}
}
else {
if (location.x > self.view.frame.size.width - 40) {
pageTransition(animated: true, direction: "fromRight")
} else if (location.x <  40) {
pageTransition(animated: true, direction: "fromLeft")
}
}
}
}
}

func pageTransition(animated: Bool, direction: String) {
let result = loadData(fileName: pagesData)

switch direction {
case "fromRight":
pageIndex += 1
case "fromLeft":
pageIndex -= 1
default: break
}

pageViews[0].pageIndex = pageIndex
pageViews[1].pageIndex = pageIndex

if pageIndex = result.pagesData.count {
pageIndex = result.pagesData.count - 1
finishReading()
} else {

let fromView = pageViews[0].isHidden ? pageViews[1] : pageViews[0]
let toView = pageViews[0].isHidden ? pageViews[0] : pageViews[1]
toView.configure(theData: result.pagesData[pageIndex])

if animated {
toView.isHidden = false
let animation = CATransition()
animation.duration = 0
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
animation.isRemovedOnCompletion = true
animation.subtype = direction

let tapAnimationType = "fade"
switch tapAnimationType {
case "pageCurl": animation.type = "pageCurl"
case "fade": animation.type = "fade"
case "moveIn": animation.type = "moveIn"
case "push": animation.type = "push"
case "reveal": animation.type = "reveal"
default: animation.type = "fade"  }

self.pageContainer.layer.add(animation, forKey: "pageAnimation")
self.pageContainer.bringSubview(toFront: toView)
}
else {
fromView.isHidden = true
toView.isHidden = false
}
}
}

}
Макет страницы:

Код: Выделить всё

class PageLayout: UIView {

var imageArray: [UIImage] = []
var index = Int()
var pageIndex = Int()

var imageDirection = ""

var imageViewTopConstraint = NSLayoutConstraint()
var imageViewBottomConstraint = NSLayoutConstraint()
var imageViewLeadingConstraint = NSLayoutConstraint()
var imageViewTrailingConstraint = NSLayoutConstraint()

private let imageView: UIImageView = {
let image = UIImageView()
image.contentMode = .scaleAspectFill
image.translatesAutoresizingMaskIntoConstraints = false
return image
}()

private let textLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()

let screenWidth = UIScreen.main.bounds.size.width

override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}

required init?(coder: NSCoder) {
fatalError("Not happening")
}

func setupViews() {
addSubview(imageView)
addSubview(textLabel)
}

func setupConstraints() {

let scenes = UIApplication.shared.connectedScenes
let windowScene = scenes.first as? UIWindowScene
let window = windowScene?.windows.first
let safeArea = window?.safeAreaInsets

textLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: safeArea!.left+16.0).isActive = true
textLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -safeArea!.right-16.0).isActive = true
textLabel.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
textLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

removeConstraints([imageViewTopConstraint, imageViewBottomConstraint, imageViewLeadingConstraint,
imageViewTrailingConstraint])

switch imageDirection {

case "left":

imageViewTopConstraint = imageView.topAnchor.constraint(equalTo: topAnchor, constant: 0.0)
imageViewBottomConstraint = imageView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0.0)
imageViewLeadingConstraint = imageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: -20.0)
imageViewTrailingConstraint = imageView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0.0)

addConstraints([imageViewTopConstraint, imageViewBottomConstraint, imageViewLeadingConstraint, imageViewTrailingConstraint])

imageView.layer.removeAllAnimations()
imageView.transform = CGAffineTransformTranslate(.identity, 0, 0)
UIView.animate(withDuration: 4.0, delay: 0, animations: {
self.imageView.transform = CGAffineTransformTranslate(.identity, 20, 0)
}, completion: nil)

case "right":

imageViewTopConstraint = imageView.topAnchor.constraint(equalTo: topAnchor, constant: 0.0)
imageViewBottomConstraint = imageView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0.0)
imageViewLeadingConstraint = imageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0.0)
imageViewTrailingConstraint = imageView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 20.0)

addConstraints([imageViewTopConstraint, imageViewBottomConstraint, imageViewLeadingConstraint, imageViewTrailingConstraint])

imageView.layer.removeAllAnimations()
imageView.transform = CGAffineTransformTranslate(.identity, 0, 0)
UIView.animate(withDuration: 4.0, delay: 0, animations: {
self.imageView.transform = CGAffineTransformTranslate(.identity, -20, 0)
}, completion: nil)

default: break
}
}

func configure(theData:  PageData) {
textLabel.text = theData.textData
imageDirection = theData.imageDirection
imageView.image = imageArray[pageIndex]
setupConstraints()
}

}
другое:

Код: Выделить всё

struct PagesData: Decodable {
var pagesData: [PageData]
}

struct PageData: Decodable {
let textData, imageDirection: String
}
JSON:

Код: Выделить всё

{
"pagesData" : [

{
"textData" : "1",
"imagePosition" : "left",
},

{
"textData" : "2",
"imagePosition" : "left",
},

{
"textData" : "3",
"imagePosition" : "right",
},

{
"textData" : "4",
"imagePosition" : "right",
},
]
}
Что у меня есть:
Все работает нормально, когда я переворачиваю страницу и жду завершения анимации. Но когда я не дожидаюсь завершения анимации и перехожу на следующую страницу, я вижу, что текущая страница с изображением быстро переходит на 0, а затем я вижу анимацию для следующей страницы.
Чего я хочу:< /p>
когда я не жду завершения анимации текущей страницы и перехожу к следующей странице, я не вижу, как текущая страница переходит на 0. Я хочу видеть плавное переворачивание
Видео, воспроизводящее проблему:
По этому адресу видео Я всегда перехожу на следующую страницу, не дожидаясь завершения анимации текущей страницы. На первой, второй и третьей страницах все работает нормально, но со следующими изображениями возникают проблемы
https://drive.google.com/file/d/1cms3G_ ... sp=sharing

Подробнее здесь: https://stackoverflow.com/questions/793 ... -animation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»