gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 04:41:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com