많은 두통과 많은 시간을 낭비했습니다. 나는 코드에서 무슨 일이 벌어지는 지 알았습니다. 암묵적인 애니메이션을 경험하고 있다고 생각했지만 갑자기 왜 이런 일이 시작되었는지 알 수 없었습니다.
나는 내재적 인 애니메이션을 더 잘 이해하려고 노력하기 때문에 통제 된 상황에서 어떻게 달성 할 것인지를 스스로 실험 해 보았습니다. 암시 적 애니메이션이 발생하지 않는 이유는 UIView 또는 해당 하위 클래스 중 하나를 항상 사용하기 때문입니다.
CALayer로 시작하여 엄격하게 레이어로 작업하면 많은 속성에 대한 모든 변경 사항이 암시 적으로 움직이는 것을 알게되었습니다.
UIView (및 그 후손)가 모두 자동으로 레이어가 백업되고 CALayer 속성이있는 것을 보면 혼란이있을 수 있습니다.
UIView가 CALayer 속성의 암시 적 애니메이션 메커니즘을 재정의하는 것이 분명합니다. 따라서 암시 적 애니메이션을 원한다면 CALayer를 직접 사용해야합니다. UIView가 동일한 동작을하는 CALayer 속성을 갖고 있기 때문에 CALayer의 속성을 직접 사용하지 않아야합니다.
내가 경험했던 버그는 ... 아마도 내가 만난 가장 이상한 것일 것입니다. 아무리 노력해도 모든 애니메이션 코드없이 값의 변화를 애니메이션으로 표현했습니다. 범인은 중첩 된 UIView 애니메이션 블록이되었습니다.
주의 사항은 다음과 바로 해제 문제를 잡을 경우 참조 :
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.2];
//animate something
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelay:.8];
[UIView setAnimationDuration:.4];
//animate something else
[UIView commitAnimations];
내가 다른 [UIView의 commitAnimations]와 중첩 된 블록을 종료하는 데 실패했습니다. 그것은 내 프로그램에서 말 그대로 애니메이션을 유출했다. 모든 것이 완전히 다른 클래스의 코드인데도 애니메이션이 적용되었습니다. 이 버그는 다음에 계속 부숴졌습니다!
[CALayer 암시 적 애니메이션을 비활성화하는 방법] 가능한 복제본 (영문) (http://stackoverflow.com/questions/5833488/how-to-disable-calayer-implicit-animations) – Warpling