ios - 如何在路径末尾停止具有负时间偏移的 CAKeyframeAnimation

标签 ios objective-c animation

我的应用程序中有一个屏幕,用户可以在其中看到沿着弧线飞行的云。此移动是在 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/

相关文章:

ios - Xcode - 如何修复 'NSUnknownKeyException',原因 : … this class is not key value coding-compliant for the key X"error?

ios - 键值编码和NSDictionary有什么区别?

objective-c - 任何 NSImage 的棕褐色版本

android - 有没有办法覆盖Android中 View 的动画辅助功能设置

javascript - Canvas - 提高动画速度而不颠簸

ios - 具有多个长任务的 NSOperation

ios - 在IOS中录制带有实时时间戳水印的视频,最好使用appcelerator

objective-c - 如何在 Mac 上禁用 cmd+q

ios - 使用 Core Graphics 时为 "Potential leak of an object"

CSS 在页面加载时淡入,在悬停时淡出