CABasicAnimation 在动画开始前快速跳转

CABasicAnimation Quickly Jumping Before Animation Start

我有一个 CABasicAnimation 动画 CAShapeLayer 的 strokeEnd 属性。每次我添加动画时,它都会快速跳过动画,然后开始执行真正的动画(如上图所示)。如果我在 viewDidLoad 中添加动画,则不会发生这种情况。

这是我的动画代码:

let progressAnim = CABasicAnimation(keyPath: "strokeEnd")
progressAnim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
progressAnim.duration = 4.5
progressAnim.fromValue = 0.0
progressAnim.toValue = 1.0

progressAnim.removedOnCompletion = false

progressLayer.addAnimation(progressAnim, forKey: "progressAnimation")
progressLayer.strokeEnd = 1.0

我不确定我到底做错了什么,我们将不胜感激任何帮助。谢谢!

我的问题出在行 progressLayer.strokeEnd = 1.0 上。我在我的代码中使用它的原因是阻止动画在完成动画后返回到它的原始值。

下一个解决方案是将 fillMode 设置为 progressAnim.fillMode = kCAFillModeForwards,将 removedOnCompletion 设置为 progressAnim.removedOnCompletion = false。这解决了我的问题。但它创造了另一个。在我的代码中,此解决方案不会将 strokeEnd 属性 更新为 toValue

我最终的解决方案是将 toValue 设置为 override func animationDidStop(anim: CAAnimation, finished flag: Bool) 内的 strokeEnd

我的动画代码:

let progressAnim = CABasicAnimation(keyPath: "strokeEnd")
        progressAnim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
        progressAnim.duration = animationDuration
        progressAnim.fromValue = 0.0
        progressAnim.toValue = 0.5
        progressAnim.delegate = self

        progressLayer.addAnimation(progressAnim, forKey: "progressAnimation")

动画完成时的代码:

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {            
        progressLayer.strokeEnd = 0.5
        progressLayer.removeAllAnimations()
    }