有没有办法实现动画的timeOffset
属性,在某个时间点启动动画,但没有"包装"行为?
我有两个动画(分为两个不同的层):
// This is the animation of the stroke of a circle
let progressAnim = CABasicAnimation(keyPath: "strokeEnd")
progressAnim.duration = duration
progressAnim.fromValue = 0
progressAnim.toValue = 1
progressAnim.fillMode = kCAFillModeBackwards
progressAnim.timeOffset = elapsed
// This is the animation of a pointer that follow the same circle as above
let arrowAnim = CAKeyframeAnimation(keyPath: "position")
arrowAnim.duration = duration
arrowAnim.rotationMode = kCAAnimationRotateAuto
arrowAnim.path = arrowPath.CGPath
arrowAnim.fillMode = kCAFillModeBackwards
arrowAnim.timeOffset = elapsed
这会在想要的进度中启动动画,但是当它达到应该结束时的动画时,它会重新开始并持续剩余的持续时间。我意识到这是timeOffset
指定工作的方式,但我希望有可能以某种方式实现相同而不包装。
答案 0 :(得分:1)
您可以计算正确的timeOffset
和相应的fromValue
,而不是duration
黑客。
e.g。
progressAnim.duration = duration - elapsed
progressAnim.fromValue = elapsed / duration
答案 1 :(得分:1)
是的,这是可能的。您需要使用与暂停和恢复“飞行中”动画相同的设置。文档相当薄弱,动画的属性令人困惑。每次我必须处理暂停和恢复动画时,我必须花半天时间再搞清楚,然后一周后,我忘记了再怎么做。我已经处理了至少6个月,所以我真的忘了怎么做。
我在github上有一个演示项目,它展示了如何暂停和恢复动画,甚至使用滑块来前后移动动画。我建议你看一下。它拥有您需要的所有部分:
答案 2 :(得分:1)
我想我明白了。通过反复试验,当我将动画的beginTime
设置为过去的某个时间时,它似乎有效:
let beginTime = CACurrentMediaTime() - offset
// Set the beginTime of the progress animation
progressAnim.beginTime = beginTime
// Set the begintTime of the arrow animation
arrowAnim.beginTime = beginTime
这似乎有预期的效果。