【iOS之Transition动画】
第一眼看Quartz2D的动画会觉得神奇兼奇怪,为什么苹果会规定Transition动画要按照下面的样例写:
苹果官方文档写到:把view属性变化的代码放置于beginAnimation和commitAnimation之间,即可自动实现动画效果。
那苹果的框架是如何捕获或感知到这中间的代码块的?先看看CoreAnimation中的动画框架解释。
当设置一个layer的值的时候,Layer-Tree(L-Tree)立即改变,而展示的Presentation Tree是由插值渐变。所以CoreAnimaton对代码块的捕获实际上是用Layer-Treey记录下了变化的东西,然后在动画线线程中把P-Tree渐变到L-Tree。
再看CATransition,这个东西没有对Layer的属性做任何的改变,只是让一个Layer执行1个动画。而这个动画会取2个值,1个是转换前的值,另1个是转换后的值。为了保证能够截取到正确的2个值,要求当值变化后,立即进行截取(CommitAnimation)。所以苹果建议动画块放在commitAnimation之前。实际上,放在commitAnimation之后也是可以的,因为当commitAnimation时,动画线程中的动画还没有执行,会延迟1段时间。但是如果动画线程快于主线程的执行,则获得不到正确的transition效果。
所以动画的实质意义是,从动画执行开始,属性变化时间变为UIAnimation指定时间(默认UIView为立即变化,CALayer为渐变),动画即是改变了Layer属性的变化时间~这就是核心,CoreAnimation以及Quartz2D的所以其它效果都是在这一基础上而搭建起来的。