我的应用中有一个屏幕,用户可以看到沿着弧线飞行的云。此举在 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:最后一个解决方案也不起作用。可能我应该剪辑传球而不是改变时间偏移...
答案 0 :(得分:4)
我找到了解决方案!问题不在CAKeyframeAnimation中,而是在CAMediaTiming中。 在此blog中解释说 timeOffset 实际上改变了动画周期,而不是时间。
为达到我的目的,我应该使用 beginTime 属性:
NSTimeInterval currentTime = [targetLayer convertTime:CACurrentMediaTime()
fromLayer:nil];
anim.beginTime = currentTime + timeOffset;
anim.duration = duration + timeOffset;