【问题标题】:How to stop CAKeyframeAnimation with negative time offset at the end of path如何在路径末尾以负时间偏移停止 CAKeyframeAnimation
【发布时间】:2014-09-23 17:04:34
【问题描述】:

我的应用中有一个屏幕,用户可以在其中看到云沿着弧线飞行。这个动作是在 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: 方法? Documented here
  • 是的,当然,我用这个方法在上一个动画结束时用随机参数创建新的动画。
  • 如何实现曲率?也许你应该制作一个没有 timeOffset 的动画,然后调整你的曲线?
  • 我使用CGPathAddArcToPoint() func 创建包含一条弧线的路径。

标签: ios objective-c animation


【解决方案1】:

我找到了解决方案!问题不在 CAKeyframeAnimation 中,而在 CAMediaTiming 中。 在这个blog 中解释说 timeOffset 实际上改变了动画周期,而不是时间。

为了达到我的目的,我应该使用 beginTime 属性:

 NSTimeInterval currentTime = [targetLayer convertTime:CACurrentMediaTime()
                                             fromLayer:nil];
 anim.beginTime = currentTime + timeOffset;
 anim.duration = duration + timeOffset;

【讨论】:

  • 你应该关闭这个问题。
  • 我认为当答案之一被标记为正确时,问题被视为已关闭。我错了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2011-12-15
  • 2016-04-13
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多