2012-02-17 3 views
1

나는 CAAnimation을 실험 중이며 CAAnimation을 수행하는 많은 새로운 사람들을 좋아합니다. 완료되면 레이어는 원래 상태로 되돌아갑니다.CAAnimation, snapping back

이 문제를 해결하는 방법에 대한 질문은 여기 몇 번 물었습니다. 대답은 CAAnimation에 다음 코드를 추가하는 것입니다.

animation.removedOnCompletion = NO; 

이 작동하지만 CAAnimation을 논의 애플의 WWDC 비디오에 따라 있지만, 권장되는 솔루션은 다음과 같습니다

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

같은 값을 설정하여

당신은 변경 사항이 애니메이션은 레이어에서 제거 된 경우에도 계속 살아 있도록 애니메이션 값이 모델에 저장되어 있는지 확인합니다.

removedOnCompletion = YES를 사용하는 것은 지속적인 해결책이 아닙니다. 레이어에서 애니메이션을 제거 할 때마다 이전 상태로 복원됩니다.

4

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

이제 답을 찾아 주셔서 감사합니다. – meiwin

+0

잠깐, 내가 할 때 속성은 즉시 1로 변경되고 움직이지 않습니다. 내가 놓친 게 있니? – jab

+0

@jab, 애니메이션 기간 (animation.duration = 3;)을 추가해야합니다. –