Я пытаюсь анимировать графику вдоль CGPathRef
, которая содержит несколько кривых Безье, и я хотел бы, чтобы анимация имела плавную постоянную скорость от начала до конца.Однако я сталкиваюсь с тем, что анимация замедляется каждый раз, когда она достигает ключевой точки.Я пытался использовать разные настройки timingFunction
и calculationMode
, но не могу найти правильную комбинацию для выполнения работы.
Вот что я получил до сих пор:
-(void)animate
{
CAKeyframeAnimation *posAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
posAnim.path = [self pathForAnimation];
posAnim.duration = 12.0;
posAnim.calculationMode = kCAAnimationPaced;
posAnim.fillMode = kCAFillModeBoth;
posAnim.removedOnCompletion = NO;
posAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[image.layer addAnimation:posAnim forKey:@"posAnim"];
}
-(CGPathRef)pathForAnimation
{
CGMutablePathRef path;
CGPoint point;
CGPoint controlPoint1;
CGPoint controlPoint2;
path = CGPathCreateMutable();
point = CGPointMake(209.5f, 24.5f);
CGPathMoveToPoint(path, NULL, point.x, point.y);
point = CGPointMake(249.5f, 64.5f);
controlPoint1 = CGPointMake(232.5f, 25.5f);
controlPoint2 = CGPointMake(249.5f, 37.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(146.5f, 301.5f);
controlPoint1 = CGPointMake(249.5f, 91.5f);
controlPoint2 = CGPointMake(147.5f, 258.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(146.5f, 458.5f);
controlPoint1 = CGPointMake(145.5f, 344.5f);
controlPoint2 = CGPointMake(170.5f, 418.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
point = CGPointMake(18.5f, 530.5f);
controlPoint1 = CGPointMake(122.5f, 498.5f);
controlPoint2 = CGPointMake(18.5f, 530.5f);
CGPathAddCurveToPoint(path, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, point.x, point.y);
return path;
}
Для чего я пытался заменить кривые прямыми линиями (используя CGPathAddLineToPoint
), и это дает мнепостоянная скорость, как я хочу.Но, конечно, я бы предпочел кривые, если это возможно.
Я также пытался заменить timingFunction
массивом timingFunctions
, но безрезультатно.