我想为路径上的对象设置动画。我知道它可以工作,但是运动不是线性的。 (沿路径中的小弯会减慢很多速度。)

这是主要步骤。

1)使用PockeSVG从SVG文件导入路径

-(CGMutablePathRef)makeMutablePathFromSVG:(NSString *)svgFileName{
    PocketSVG *myVectorDrawing0 = [[PocketSVG alloc] initFromSVGFileNamed:svgFileName];
    UIBezierPath *myBezierPath0 = myVectorDrawing0.bezier;
    return CGPathCreateMutableCopy([myBezierPath0 CGPath]);
}

2)创建CAKeyFrameAnimation
CAKeyframeAnimation *moveAlongPath = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef animationPath = CGPathCreateMutableCopy(pathForwardTo5);
[moveAlongPath setPath:animationPath];
[moveAlongPath setDuration:1.0f];
moveAlongPath.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
moveAlongPath.delegate = self;
[[trackButton layer] addAnimation:moveAlongPath forKey:@"moveButtonAlongPath"];
CFRelease(animationPath);

我尝试使用其他CAMediaTimingFunctions,它们都表现出这种行为。

问题:动画本身可以工作,但不能保持平稳一致的速度。知道为什么吗?

最佳答案

您看到的变慢是由于默认的计算模式所致,其中动画的每个片段花费相同的时间。这意味着非常短的段将变慢。

如果您查看documentation for the path property,您将看到如何沿路径实现恒定速度:

动画沿路径进行的方式取决于calculationMode属性中的值。要沿路径实现平滑,恒定速度的动画,请将calculationMode属性设置为kCAAnimationPacedkCAAnimationCubicPaced

因此,为了在整个动画过程中保持稳定的步伐,应将calculationMode设置为kCAAnimationPaced

07-26 09:40