Mac OS: CAAnimation - 无缝更新动画

Mac OS: CAAnimation - seamlessly update the animation

我正在制作自定义 UI 元素,我需要对其进行动画处理。问题是在某些时候我需要更新我的动画,但是当我更新它时,当前动画位置(状态)和新动画之间存在可见的 lag/gap。

换句话说,当我应用新动画时,这个动画从0位置(状态)开始,而前一个动画的实际(可见)状态是不同的。

示例如下:(link)

<blockquote class="imgur-embed-pub" lang="en" data-id="a/q3NA31f"><a href="//imgur.com/q3NA31f"></a></blockquote><script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>

动画代码:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim.duration = time;
anim.repeatCount = INFINITY;
anim.fromValue = from;
anim.byValue = by;

[self.myLayer addAnimation:anim forKey:kActivityAnimationKey];

首次应用的动画具有不同的 time/from/by 参数。

任何 的建议将不胜感激,因为我坚持了两天并尝试了此时出现的所有问题。

我能够完成这个任务,我将对这个问题给出一个笼统的答案。

如果您想更新当前正在进行的动画,但您正处于其中,则需要将当前动画替换为将在正确位置结束当前动画的动画。

例如,在我的问题中有一个动画有 fromValuebyValue。这意味着,如果您以不同的持续时间启动相同的动画,它会将其当前旋转状态更改为 fromValue.

要修复此行为,我们需要添加动画,以完成从当前旋转状态到 fromValue 的动画。要获得当前的旋转,或其他 属性 您需要的动画,我们有 presentationLayer 的 CALayer。我们可以将它的值设置为我们的 "closing" 动画。

我们如何知道关闭动画何时结束?答案是CAAnimationDelegate。只需为结束动画设置一个委托,完成后添加另一个具有不同参数的动画。您现在可以无缝更新您的动画了。

请记住,关闭动画时间必须是原始动画时间的一小部分才能使事情顺利进行。你可以这样计算:(end state - current state) * original duration.