Mac OS:CAAnimation-无缝更新动画

时间:2019-04-01 01:10:29

标签: objective-c macos animation calayer caanimation

我正在制作自定义UI元素,需要对其进行动画处理。问题在于,有时我需要更新动画,但是当我更新动画时,当前动画位置(状态)与新动画之间存在明显的滞后/间隙。

换句话说,当我应用新动画时,此动画从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];

第一次应用的动画具有不同的时间/开始/结束时间参数。

任何的建议将不胜感激,因为我坚持了两天,并尝试了这次遇到的所有事情。

1 个答案:

答案 0 :(得分:0)

我能够完成此任务,我将对此问题给出一个一般性的答案。

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

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

要解决此问题,我们需要添加动画,以完成将动画从当前旋转状态转换为fromValue的过程。为了获得当前的旋转值或需要设置动画的其他属性,我们有presentationLayer的CALayer。我们可以将其值设置为“关闭”动画。

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

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