CAKeyframeAnimation具有交错的开始时间

时间:2018-12-06 16:56:02

标签: ios core-animation

我正在尝试创建一个动画,其中物品进入时会交错显示。为此,我使用了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 :(得分:2)

添加动画后,应将属性值设置为动画的最终值。最终值是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!)
}

答案 1 :(得分:1)

我用来解决此问题的一种方法是为动画设置CAAnimationDelegate并实现animationDidStop(CAAnimation, finished: Bool)。创建对视图图层的引用,并在动画完成后设置所需的变换。