gpt4 book ai didi

cocoa - CAAnimation 在周期性动画进度间隔中调用方法?

转载 作者:行者123 更新时间:2023-12-03 16:21:46 26 4
gpt4 key购买 nike

假设我想要制作一个向右滚动 1000 像素的球的动画,并在此过程中指定一个计时函数 - 如下所示:

UIView *ball = [[UIView alloc] initWithFrame:CGRectMake(0,0,30,30)];
CABasicAnimation* anim =
[CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
anim.toValue = [NSNumber numberWithFloat:ball.frame.origin.x + 1000.0];
// move 1000 pixels to the right
anim.duration = 10.0;
anim.timingFunction = [CAMediaTimingFunction functionWithControlPoints:
0.1 :0.0 :0.3 :1.0]; // accelerate fast, decelerate slowly
[ball.layer addAnimation:anim forKey:@"myMoveRightAnim"];

我最终想要的是有一个方法,比如-(void)animationProgressCallback:(float)progress,在动画期间定期调用动画的进度以开始值和结束值之间的绝对“距离”表示,即忽略计时函数。

我将尝试用上面的例子来解释,球向右滚动 1000 像素(以 y 轴绘制,在我们的例子中为 100%=1000 像素):

alt text

我希望每当球前进 250 像素时就调用我的回调方法。由于计时功能,前 250 个像素可能会在 ti0=2 秒内到达,总距离的一半在 ti1= 0.7 秒后到达(快速加速踢) in),750px 标记又过了 ti2= 1.1 秒,并且需要剩余 ti3= 5.2 秒才能达到 100% (1000px) 标记。

什么会很棒,但没有提供:

如果动画按照描述在动画进度间隔中调用委托(delegate)方法,我就不需要问这个问题......;-)

解决问题的想法:

我能想到的一个解决方案是计算贝塞尔曲线的值,将其映射到 tik 值(我们知道总动画持续时间),当动画开始时,我们依次执行我们的 animationProgresssCallback: 选择器手动处理这些延迟。

显然,这是疯狂的(手动计算贝塞尔曲线??),更重要的是,不可靠(我们不能依赖动画线程和主线程同步 - 或者我们可以吗?)。

有什么想法吗?

期待您的想法!

最佳答案

Ideas how to solve the problem:

One solution I can think of is to calculate the bezier curve's values, map that to the tik values (we know the total animation duration), and when the animation is started, we sequentially perform our animationProgresssCallback: selector with those delays manually.

Obviously, this is insane (calculating bezier curves manually??) and, more importantly, unreliable (we can't rely on the animation thread and the main thread to be in sync – or can we?).

其实这个是靠谱的。 CoreAnimation 是基于时间的,因此您可以使用委托(delegate)在动画真正开始时收到通知。关于计算贝塞尔曲线路径......我们这样看:如果你想在 OpenGLES 中实现一个表面,你必须计算三次贝塞尔曲线,情况可能会更糟!哈哈。你的情况只是一维,如果你懂数学的话,这并不难。

关于cocoa - CAAnimation 在周期性动画进度间隔中调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257204/

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