我有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
我不确定我到底做错了什么,任何帮助都会受到高度赞赏。谢谢!
答案 0 :(得分:1)
我的问题在于行progressLayer.strokeEnd = 1.0
。我在我的代码中有这个原因是为了阻止动画在完成动画时回到它的原始值。
下一个解决方案是将fillMode
设置为progressAnim.fillMode = kCAFillModeForwards
,将removedOnCompletion
设置为progressAnim.removedOnCompletion = false
。这种方式解决了我的问题。但它创造了另一个。在我的代码中,此解决方案不会将strokeEnd
属性更新为toValue
。
我的最终解决方案是将toValue
设置为strokeEnd
内的override func animationDidStop(anim: CAAnimation, finished flag: Bool)
。
我的动画代码:
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()
}