Как позволить CAKeyframeAnimation забрать текущее состояние при переопределении другого? - PullRequest
3 голосов
/ 23 августа 2009

У меня есть такой:

CALayer *layer = stripeButton.layer;
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"bounds.origin.y"];
moveAnim.duration = 3.35;
moveAnim.repeatCount = 0;
moveAnim.autoreverses = NO;
moveAnim.removedOnCompletion = NO;
moveAnim.calculationMode = kCAAnimationLinear;
moveAnim.fillMode = kCAFillModeForwards;

// ... keys and values here ...

[theLayer addAnimation:moveAnim forKey:@"theAnimation"];

Вы видите, что эта анимация идет 3,35 секунды. Между тем может случиться, что через 2 секунды будет запущена новая анимация с тем же ключом @ "theAnimation" для разных значений.

Проблема с тем, что происходит: новая анимация не улавливает текущее видимое состояние. Начинается тяжело с нуля. Вид переходит в начальную позицию в ужасной манере, и оттуда начинается новая анимация. Для UIView есть setAnimationsBeginFromCurrentState = YES, но я не нашел ничего подобного для CAKeyFrameAnimation. Есть идеи?

1 Ответ

4 голосов
/ 27 августа 2009

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

-

Выдержка из справочника классов CALayer:

 -(id)presentationLayer

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

-

Связь дерева слоев (ваших данных), дерева презентаций (текущих значений интерполяции ваших данных) и дерева рендеринга объясняется здесь в руководстве по программированию CA.

Базовая архитектура рендеринга анимации

...