【发布时间】: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