CAKeyframeAnimation с шахматным временем начала - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать анимацию, в которой элементы появляются для просмотра в шахматном порядке.Для этого я использовал CAKeyframeAnimation, но для достижения ошеломления мне нужно указать beginTime.

Проблема в том, что мне бы хотелось, чтобы анимация не возвращалась к исходной позиции после ее завершения, поэтому я задаю значение для модели следующим образом: view.layer.transform = CATransform3DIdentity перед анимация добавлена ​​в слой.

Однако анимация возвращается к исходной позиции, потому что я указал beginTime.Есть ли способ обойти это?

func addAnimation(view: UIView, index: Int) {
    let values = RK4SpringAnimation(tension: 600, friction: 60, initialVelocity: 0) // just provides an array of values between 0.0 and 1.0.
    let positions = values.map { Float(view.layer.frame.width) - (Float($0) * Float(view.layer.frame.width)) }
    let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
    animation.values = positions
    animation.duration = 0.716
    animation.beginTime = CACurrentMediaTime() + Double(index) * 0.015
    view.layer.transform = CATransform3DIdentity // set the final value on the model.
    view.layer.add(animation, forKey: "transform2")
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

После добавления анимации вы должны установить в качестве значения свойства окончательное значение анимации.Является ли конечное значение CATransform3DIdentity?

Если beginTime анимации находится в будущем, и начальное значение анимации не равно ее конечному значению, тогда вы можете установить animation.fillMode = .backwards, чтобы сообщить Core Animation:применять начальное значение анимации к слою, пока не будет достигнут beginTime.

func addAnimation(view: UIView, index: Int, show: Bool) {
    let values = RK4SpringAnimation(tension: 600, friction: 60, initialVelocity: 0) // just provides an array of values between 0.0 and 1.0.
    let positions = values.map { Float(view.layer.frame.width) - (Float($0) * Float(view.layer.frame.width)) }
    let animation = CAKeyframeAnimation(keyPath: "transform.translation.x")
    animation.values = positions
    animation.duration = 0.716
    animation.beginTime = CACurrentMediaTime() + Double(index) * 0.015
    animation.fillMode = .backwards
    view.layer.add(animation, forKey: animation.keyPath)
    view.layer.setValue(positions.last!, forKey: animation.keyPath!)
}
0 голосов
/ 06 декабря 2018

Один из способов, который я использовал для решения этой проблемы, - установить CAAnimationDelegate для вашей анимации и реализовать animationDidStop(CAAnimation, finished: Bool).Создайте ссылку на слой вашего представления и установите желаемое преобразование после завершения анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...