2013-03-25 3 views
0

У меня есть анимация ключевого кадра подслоя, предназначенная для анимации изображения вдоль линии BSpline, сгруппированной вместе с анимацией вращения. Если для параметра sub-layer.speed установлено значение 0, я могу перетащить изображение вперед и назад вдоль кривой, отрегулировав значение анимацииGroup.timeOffset на основе расстояния, которое было перенесено. Что я хочу сделать, после определенного порога (например,% 15) установить скорость анимации до 1, чтобы анимация завершилась сама по себе, но это не так просто. Анимация завершается немедленно и сбрасывает все обратно в начальную позицию, или анимация достигает конца пути, циклически округляется до нуля и продолжает анимацию, пока она не вернется к точке, в которой анимация срабатывает.Запуск CAKeyframeAnimation из ненулевого времени

Что я хочу:

Tstart -> сопротивление -> T0.15 -> анимация -> Склоняюсь

Но то, что я получаю

Tstart -> сопротивление -> T0.15 -> анимация - > Тенд -> Tstart -> T0.15

Я уже рассмотрел использование timeOffset и временные искажения и искал параметры, но безуспешно.

ответ

0

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

- (void) setTimeOffset:(double)value 
{ 
    if (value < 0.15) { 

     // This is what you are already doing. 
     _animGroup.timeOffset = value; 
     [_someSublayer addAnimation:_animGroup forKey:@"animGroup"]; 

    } else if (_animGroup.speed == 0.0) { 

     // You must set the final position before animating otherwise the 
     // layer will come back to it's original position. 

     _someSublayer.position = _theEndPointOfYourPath; 

     // Now set the speed of the animation group to 1 so that it animates. 
     // Be sure to leave the timeOffset alone so that is starts where you want it. 

     _animGroup.speed = 1.0; 

     // Create a new animation group around it whose duration is the remaining time 
     // of the animation group and add that to the layer instead. It will prevent 
     // animGroup from wrapping. 

     CAAnimationGroup *outerGroup = [[CAAnimationGroup alloc] init]; 
     outerGroup.animations = @[_animGroup]; 
     outerGroup.duration = _animGroup.duration - _animGroup.timeOffset; 

     [_someSublayer addAnimation:outerGroup forKey:@"animGroup"]; 
    }  
}