如何沿NSBezier路径控制动画计时?

时间:2017-08-09 20:44:03

标签: objective-c quartz-core cakeyframeanimation nsbezierpath

在Apple关于CAKeyframeAnimation的文档中,他们说:

  

“对于大多数类型的动画,您可以使用指定关键帧值   values和keyTimes属性。在动画期间,Core   动画通过在插值之间插值来生成中间值   您提供的价值。动画化作为坐标点的值时,   例如图层的位置,您可以指定该点的路径   而不是单个值。动画的节奏是   由您提供的时间信息控制。“

enter image description here

我想要做的是在控制时间的同时沿着上面的路径制作图像动画。更具体地说,路径从(0,0)开始并在1秒内变为(100,0),然后在3秒内沿着半圆路径到达点(300,0),然后到达点(400, 0)在1秒内。

我已经将此路径定义为NSBezier路径,我可以制作动画,但我不知道如何控制路径不同部分的时序。从Apple的文档看来,这应该是可能的,但是如何?

2 个答案:

答案 0 :(得分:0)

从这里获取参考Controlling Animation Timing

答案 1 :(得分:0)

有一个简单的解决方案。您唯一要选择的是路径上要用于时间控制的点。在我的情况下,我有4个点p0 =(0,0),p1 =(100,0),p2 =(200,0),p3 =(300,0)。然后我用

animation.values = @[[NSValue valueWithPoint:p0],
                               [NSValue valueWithPoint:p1],
                               [NSValue valueWithPoint:p2],
                               [NSValue valueWithPoint:p3]];

animation.keyTimes = @[@0.0, @0.2, @0.8, @1.0];

我们使用半圆(或任何其他复杂的)路径的事实不会产生任何影响(只要它不跨越自身)。您只需在路径上选择一些点,使用它们来定义animation.values,然后为这些点选择(相对)时间并使用它们来定义animation.keyTimes。这就是全部,真的。