CAAnimation, огрызаясь


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

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

animation.removedOnCompletion = NO;

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

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

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

2 2

2 ответа:

Явные анимации фактически не изменяют атрибуты CALayer.

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

Установив значение следующим образом

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

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

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

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

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

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

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"];