iOS之Transition动画

37 篇文章 1 订阅
19 篇文章 0 订阅

原文: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值