Хорошо, много головных болей и много потерянного времени спустя, я понял, что, черт возьми, происходит в моем коде. Я думал, что испытываю неявную анимацию, но я не мог понять, почему это стало происходить внезапно.
Я решил, что лучше попытаться понять неявные анимации, поэтому я экспериментировал сам, чтобы выяснить, как их достичь в контролируемой ситуации. Причина, по которой я никогда не видел неявных анимаций, заключается в том, что я всегда использую UIView или один из его подклассов.
Я узнал, что если вы начнете с CALayer и будете работать строго со слоем, все изменения многих свойств будут неявно анимированы.
Может возникнуть некоторая путаница (я знаю, что это было для меня), когда вы увидите, что все объекты UIView (и их потомство) автоматически защищены слоями и имеют свойство CALayer.
Тем не менее очевидно, что UIView каким-то образом переопределяет механизм неявной анимации своего свойства CALayer. Поэтому, если вам нужны неявные анимации, вы должны использовать CALayer напрямую, а не просто предполагать, что, поскольку UIView имеет свойство 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]. Это была буквально утечка анимации в моей программе. Все оживляло, даже код в совершенно разных классах. Эта ошибка устранена ... на следующий!