我的应用程序中有一个屏幕,用户可以在其中看到沿着弧线飞行的云。此移动是在 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:最后一个解决方案也不起作用。可能我应该剪辑 channel 而不是更改时间偏移...
最佳答案
我找到了解决方案!问题不在 CAKeyframeAnimation 中,而在 CAMediaTiming 中。 在这个blog解释说 timeOffset 实际上改变的是动画周期,而不是时间。
为了实现我的目的,我应该使用 beginTime 属性:
NSTimeInterval currentTime = [targetLayer convertTime:CACurrentMediaTime()
fromLayer:nil];
anim.beginTime = currentTime + timeOffset;
anim.duration = duration + timeOffset;
关于ios - 如何在路径末尾停止具有负时间偏移的 CAKeyframeAnimation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064209/