CA анимация, возвращаясь

Я экспериментирую с CAAnimation и, как и многие новички, делает CAAnimation; после завершения слой возвращается в исходное состояние.

Вопрос о том, как решить эту проблему, несколько раз задавали здесь, и ответ заключается в добавлении следующего кода в CAAnimation.

animation.removedOnCompletion = NO;

Хотя это работает, но, согласно видео Apple WWDC, где обсуждается CAAnimation, рекомендуемое решение будет следующим:

// animating opacity
layer.opacity = newOpacityValue;
[layer addAnimation:animation forKey:@"opacity"];

Поэтому мне интересно узнать, в чем главное различие между этими двумя и когда их использовать?

2 ответа

Решение

Явные анимации на самом деле не изменяют атрибуты CALayer.

Они просто модифицируют презентационный слой, это то, что вы на самом деле видите. Когда анимация закончится, вы увидите CALayer точно таким же, каким он был до анимации.

Установив значение как это

// animating opacity
layer.opacity = newOpacityValue;
[layer addAnimation:animation forKey:@"opacity"];

вы убедитесь, что анимированные значения хранятся в модели, поэтому ваши изменения будут действовать даже после удаления анимации из слоя.

Использование removeOnCompletion = YES не является постоянным решением. Всякий раз, когда вы удаляете анимацию из слоя, он восстанавливает свое прежнее состояние.

Вам не нужен флаг "removeOnCompletion".

То, что вам нужно, это установить непрозрачность на новое значение вне анимации - как ваш второй пример.

использование "removeOnCompletion" не освободит ваш объект анимации - взорвать вашу память, если у вас много анимаций.

CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"opacity"];
animation.fromValue=[NSNumber numberWithFloat:0];
animation.toValue=[NSNumber numberWithFloat:1];

layer.opacity=1; // this line will make sure the opacity will stay 1 when the animation is completed
[layer addAnimation:animation forKey:@"opacity"];
Другие вопросы по тегам