CAKeyFrameAnimation重复之前延迟的时间

7

我有一个球形图像,正在沿着路径进行动画。动画设置为无限重复,但为什么在重复之间会有延迟?

以下是我的代码:

CGPathRef aPath;
aPath = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, SIZE, SIZE), NULL);

[CATransaction begin];

arcAnimation = [CAKeyframeAnimation animationWithKeyPath: @"position"];
[arcAnimation setBeginTime:CACurrentMediaTime()];
[arcAnimation setDuration: 1.5];
[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
[arcAnimation setAutoreverses: NO];
[arcAnimation setRepeatCount:HUGE_VALF];
arcAnimation.removedOnCompletion = NO;
arcAnimation.fillMode = kCAFillModeRemoved;
[arcAnimation setPath: aPath];
[ball.layer addAnimation: arcAnimation forKey: @"position"];
[CATransaction commit];
CFRelease(aPath);
3个回答

13

试一试:

[animation setCalculationMode:kCAAnimationPaced]

花了一个小时试图弄清楚这个问题……为什么那不是默认值呢?! - cph2117

1
我不知道确切的答案,但你在这里做了很多不必要的事情,我的建议是你应该先把它们删除。没有必要使用CATransaction块(begincommit)。也不需要设置setBeginTime:。绝对不需要设置removedOnCompletionfillMode,因为这不是分组动画。只需将动画添加到层中并退后即可。它将立即开始并永远重复,你的代码将更简单、更好。

0

您必须将kCAFillModeRemoved替换为kCAFillModeForwards或其他值。请阅读文档以了解原因。

此外:

替换:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]

根据您的测试结果:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]

或者

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]

Nirav,我绝对不想缓慢进入或退出。我希望动画在圆圈中以恒定的速度运行,而不会加速或减速。我尝试了所有不同的填充模式,但没有任何明显的影响。动画仍然在结束前暂停一会儿,然后重新开始。 - Kelly Bennett
我认为是setBeginTime调用创建了这个问题。因为你调用它,它需要一些时间来评估应该开始的秒数,这就解释了延迟。尝试将其移除。 - Nirav Bhatt
我已经将其移除。仍然表现完全一样。 - Kelly Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接