以给定偏移量开始动画

时间:2014-12-24 13:07:53

标签: ios swift core-animation

有没有办法实现动画的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指定工作的方式,但我希望有可能以某种方式实现相同而不包装。

3 个答案:

答案 0 :(得分:1)

您可以计算正确的timeOffset和相应的fromValue,而不是duration黑客。

e.g。

progressAnim.duration = duration - elapsed
progressAnim.fromValue = elapsed / duration

答案 1 :(得分:1)

是的,这是可能的。您需要使用与暂停和恢复“飞行中”动画相同的设置。文档相当薄弱,动画的属性令人困惑。每次我必须处理暂停和恢复动画时,我必须花半天时间再搞清楚,然后一周后,我忘记了再怎么做。我已经处理了至少6个月,所以我真的忘了怎么做。

我在github上有一个演示项目,它展示了如何暂停和恢复动画,甚至使用滑块来前后移动动画。我建议你看一下。它拥有您需要的所有部分:

Keyframe view animation demo on 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

这似乎有预期的效果。