我想为路径上的对象设置动画。我知道它可以工作,但是运动不是线性的。 (沿路径中的小弯会减慢很多速度。)
这是主要步骤。
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
属性设置为kCAAnimationPaced
或kCAAnimationCubicPaced
。
因此,为了在整个动画过程中保持稳定的步伐,应将calculationMode
设置为kCAAnimationPaced
。