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()
}
我有一个 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()
}