Плавная анимация на CAKeyframeAnimation для анимации CATransform3D

Я создал собственную анимацию перехода между представлениями. Я анимирую два свойства, позицию и преобразование, чтобы обеспечить переход между представлениями в виде куба. Фрейм использует CABasicAnimation, в то время как преобразование использует "2 этапа" CAKeyframeAnimation. Все работает нормально, за исключением одной маленькой детали, которую я не могу понять. В своем переходе я применяю CATransform3DScale к среднему ключевому кадру, чтобы создать эффект увеличения / уменьшения. Это отлично работает, за исключением того, что анимация выглядит немного отрывистой. Это линейная анимация между ключевыми кадрами, и я хотел бы это сгладить. Теперь у CAKeyframeAnimation есть способ сделать это с помощью calculationMode, но, похоже, он не работает для преобразований. Я пробовал установить его на kCAAnimationCubic и kCAAnimationCubicPaced, но безрезультатно.

Вот код, который анимирует преобразование одного представления (аналогичный блок кода анимирует другое представление):

    CAKeyframeAnimation *aTransform = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    CATransform3D transform1 = RotateOnX(toView, M_PI_4);
    transform1 = CATransform3DScale(transform1, RotationalZoom, RotationalZoom, RotationalZoom);
    [aTransform setValues:Array([NSValue valueWithCATransform3D:RotateOnX(toView, M_PI_2)],
                                [NSValue valueWithCATransform3D:transform1],
                                [NSValue valueWithCATransform3D:RotateOnX(toView, 0)])];
    [toView.layer addAnimation:aTransform forKey:@"transform"];

Примечание. RotateOnX(UIView *, CGFloat) - это блок, который возвращает преобразование для вида, повернутого по оси X на желаемые радианы.

Как видите, я установил масштабирующее преобразование только для среднего ключевого кадра. Кроме того, вращение обзора идеально плавное, только масштабирование кажется «рывком» при изменении направления.

Есть у кого-нибудь идеи, как сгладить масштабирование / масштабирование?


person Aaron Hayman    schedule 20.07.2012    source источник


Ответы (1)


Попробуйте свойство timingFunctions. Поскольку у вас есть 3 ключевых кадра, вам понадобятся 2 функции синхронизации: одна для анимации от ключевого кадра 0 до ключевого кадра 1, а другая для анимации от ключевого кадра 1 до ключевого кадра 2.

aTransform.timingFunctions = [NSArray arrayWithObjects:
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut],
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInOut],
    nil];
person rob mayoff    schedule 20.07.2012
comment
Извините, я не понял ... Я использовал фрейм для захвата всех границ, точки привязки и положения. Фактически, я только анимирую позицию вместе с измененными точками привязки, чтобы «перемещать» свои представления. Я обновлю свой вопрос, чтобы уточнить. - person Aaron Hayman; 21.07.2012
comment
О боже ... Я совершенно пропустил это, и я просматривал эти классные документы по крайней мере 10 раз за 6 часов ... тьфу. Работает отлично. Серьезно, спасибо! - person Aaron Hayman; 21.07.2012
comment
О, к вашему сведению - это работает лучше, когда вы расслабляетесь, а затем расслабляетесь: [NSArray arrayWithObjects: [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], nil]; - person Aaron Hayman; 21.07.2012