BezierPath анимация

У меня есть кривая Безье, и я анимирую объект, чтобы перемещаться по ней с помощью CAKeyFrameAnimation. Но, скажем, объект останавливается в некоторой точке кривой при обнаружении нажатия пользователем. Затем при нажатии кнопки возобновления движения объект должен двигаться по оставшейся траектории до конца. Как мне это сделать?

Если я добавляю путь к объекту CAKeyFrameAnimation, то при нажатии кнопки возобновления объект перемещается вправо от начала до конца пути. Не с того места, где он остановился. Я хочу, чтобы он продолжал двигаться только с того места, где он остановился, а не запускался снова с начала. Есть ли способ оживить его по пути с точки, в которой он останавливается?


person Nathan    schedule 30.12.2010    source источник


Ответы (1)


Все временные характеристики базовой анимации реализованы в протоколе CAMediaTiming. Одним из его свойств является speed, который определяет время анимации для слоя относительно временного пространства его родительского слоя. Установка для свойства speed значения 0.0 фактически приостанавливает анимацию.

Вам нужно немного поработать, чтобы убедиться, что анимация завершится правильно после ее перезапуска. Технические вопросы и ответы QA1673 в документации содержит следующий пример кода, который должен работать на вас:

-(void)pauseLayer:(CALayer*)layer
{
  CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
  layer.speed = 0.0;
  layer.timeOffset = pausedTime;
}

-(void)resumeLayer:(CAlayer*)layer
{
  CFTimeInterval pausedTime = [layer timeOffset];
  layer.speed = 1.0;
  layer.timeOffset = 0.0;
  layer.beginTime = 0.0;
  CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
  layer.beginTime = timeSincePause;
}
person Nathan Eror    schedule 03.01.2011