2012-02-17 2 views
1

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

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

animation.removedOnCompletion = NO; 

В то время как это работает, но в соответствии с WWDC видео от Apple обсуждает CAAnimation, рекомендуемым решением будет:

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

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

+0

@ Должно быть, я имел в виду addAnimation: animation, исправил исходный код. – meiwin

+0

См. Также https://oleb.net/blog/2012/11/prevent-caanimation-snap-back/ –

ответ

12

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

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

При установке значения, как этот

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

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

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

4

Вам не нужен флаг «deletedOnCompletion».

Вам необходимо установить непрозрачность для нового значения вне Анимации - как ваш второй пример.

Использование «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"]; 
+0

Теперь это имеет смысл, спасибо за ответ! – meiwin

+0

Подождите, когда я это сделаю, свойство сразу изменится на 1 и не оживит. Я что-то упускаю? – jab

+0

@jab, вам нужно добавить продолжительность анимации (animation.duration = 3;) –

Смежные вопросы