我的应用程序中有一个屏幕,用户可以看到沿着弧线飞行的云。这个动画是通过使用CAKeyframeAnimation实现的,并且能够正确地运行。但是我想改进动画,使得当用户打开屏幕时,云必须看起来已经在动画中了。也就是说,云应该出现在弧线的中间位置。我是这样实现的:
theKeyframeAnimation.timeOffset = randomTimeOffset;
动画从给定的时间开始(偏移量为负)。但是!当云到达路径的结尾时,动画不会停止。云将继续从路径的起点移动!似乎动画持续时间没有改变。
我试图通过在特定时间后删除动画来修复此问题:
NSTimeInterval removingDelay = theKeyframeAnimation.duration + theKeyframeAnimation.offset;
dispatch_time_t dispatchTime = dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(removingDelay * NSEC_PER_SEC));
dispatch_after(dispatchTime, dispatch_get_main_queue(), ^
{
[cloud.layer removeAnimationForKey:@"animation_along_arc"];
});
但是这种解决方案效果不佳。动画时间和分派时间不同步。实际上,动画比所需的晚约0.5秒被移除。
更新: 现在我看到可能的解决方案。我可以用CAAnimationGroup包装每个动画。然后设置动画组的持续时间:
animationGroup.animations = @[theKeyframeAnima];
animationGroup.duration = theKeyframeAnima.duration + theKeyframeAnima.timeOffset;
我找到的是最优雅的解决方案。欢迎任何建议。
更新2:这个最后的解决方案也不起作用。可能我应该剪辑密码而不是改变时间偏移...
animationDidStop:finished:
方法吗?在这里有文档。 - TrenskowCGPathAddArcToPoint()
函数创建包含一条弧线的路径。 - kelin