CAKeyframeAnimation с кривыми Безье и постоянной скоростью - PullRequest
4 голосов
/ 15 ноября 2011

Я пытаюсь анимировать графику вдоль 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, но безрезультатно.

1 Ответ

2 голосов
/ 01 мая 2012

Вы пробовали установить для свойства accountMode анимации ключевого кадра значение kCAAnimationCubicPaced? Это свойство специально предназначено для того, чтобы анимация следовала в постоянном темпе по всей кривой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...