Mac OS:CAAnimation - 无缝更新动画

问题描述 投票:0回答:1

我正在制作自定义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];

第一个应用的动画具有不同的时间/来自/通过参数。

任何建议都会受到高度赞赏,因为我在两天内坚持了下来,并尝试了此时的所有内容。

objective-c macos animation calayer caanimation
1个回答
0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.