iOS之Transition动画

来源:互联网 发布:voa英语听力软件下载 编辑:程序博客网 时间:2024/05/12 10:52

原文:http://www.cnblogs.com/tekkaman/archive/2012/11/05/2755688.html


第一眼看Quartz2D的动画会觉得神奇兼奇怪,为什么苹果会规定Transition动画要按照下面的样例写:

            [UIView beginAnimations:nil context:nil];            [UIView setAnimationCurve:UIViewAnimationCurveLinear];//动画变化曲线,线性渐变            [UIView setAnimationDuration:2.0];//动画持续时间            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];//动画过渡                        static int mmm = 0;            mmm++;            [self.view setBackgroundColor: (mmm%2) ? [UIColor whiteColor] : [UIColor blackColor]];                        [UIView setAnimationDelegate:self];            [UIView commitAnimations];

  苹果官方文档写到:把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的所以其它效果都是在这一基础上而搭建起来的。


0 0