Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 跳跃式CADisplayLink动画_Ios_Caanimation_Cakeyframeanimation_Cadisplaylink - Fatal编程技术网

Ios 跳跃式CADisplayLink动画

Ios 跳跃式CADisplayLink动画,ios,caanimation,cakeyframeanimation,cadisplaylink,Ios,Caanimation,Cakeyframeanimation,Cadisplaylink,如前一篇文章()所述,我正在创建一个从初始角度开始并移动到结束角度的动画。我决定使用CADisplayLink制作此动画,因为在用户输入期间动画需要尽可能快地运行,因此带有CAKeyframeAnimation的CALayer似乎太慢,无法实现这一点 在实现了调用setNeedsDisplay的CADisplayLink之后,我确实让动画工作了,但它看起来非常糟糕,因为它将endAngle和initialAngle之间的差异分割成大量可见的角度块,而不是创建从一个角度到下一个角度的连续流。以下是

如前一篇文章()所述,我正在创建一个从初始角度开始并移动到结束角度的动画。我决定使用
CADisplayLink
制作此动画,因为在用户输入期间动画需要尽可能快地运行,因此带有
CAKeyframeAnimation
CALayer
似乎太慢,无法实现这一点

在实现了调用
setNeedsDisplay
CADisplayLink
之后,我确实让动画工作了,但它看起来非常糟糕,因为它将endAngle和initialAngle之间的差异分割成大量可见的角度块,而不是创建从一个角度到下一个角度的连续流。以下是我的当前代码:

CGFloat newAngleToAnimate = animationProgress + ((endAngle-initialAngle)/kDrawDuration)*elapsedTime;

// Use newAngleToAnimate to draw in drawInContext

animationProgress = newAngleToAnimate; // Update the progress for the next frame.
另外,
kDrawDuration
被定义为
3.0f
,因此我希望从
initialAngle
endAngle
的动画需要3.0秒。我通过计算
2*M_PI/kNumAnglesInAnimation
将整个圆(
2*M_PI
弧度)分成相等的段,最好是每帧设置一个角度的动画,但不知何故我仍然必须考虑
kDrawDuration
elapsedTime
,我只是不知道该怎么做

感谢您对修复此问题的任何帮助

CGFloat newAngleToAnimate = animationProgress + ((endAngle-initialAngle)/kDrawDuration)*elapsedTime;
不要跟踪“动画进度”。您所需的全部时间就是使动画正确运行所需的时间。因此,只需将其移除并使用:


CGFloat newangle to animate=((endAngle initialAngle)/kDrawDuration)*elapsedTime

我尝试了这个,但它没有正确地设置动画。我应该注意,我正在对
elapsedTime
使用以下计算:
CFTimeInterval elapsedTime=\u displayLink.timestamp-lastDrawTime谢谢,但是。你需要记录你开始画画(第一次画画时间)后的时间,而不是上次画画(最后一次画画时间)后的时间。很有趣,谢谢。我会试试这个,让你知道它是如何工作的!所以它确实起作用了,但就它的运动方式而言,它看起来仍然很“笨重”,这让我怀疑它是否与新的AngleToAnimate计算无关。如果我把2pi分成300个不同的部分,每个部分之间的角度相同,是否应该在
CADisplayLink
上设置一些设置,例如
frameInterval
,以使其运行速度尽可能快或其他什么?我想我意识到了问题的所在:无论endAngle initialAngle是什么,动画的持续时间都是相同的。因此,当endAngle initialAngle小于约2pi/3时,它看起来非常完美,但在这之后,动画持续时间太短,不适合大的endAngle。所以我想我最后要做的是一个切换案例,为我的圆圈的不同部分设置持续时间。