什么叫隐式动画?比如说改变CALayer一个可做动画的属性,它的变化是渐变而不是跳变的,这就是隐式动画(既没有设置动画时间也没有设置动画类型),隐式动画默认就是开启的,可以手动关闭。
辣么问题来了,当改变一个属性的时候Core Animation是如何判断动画类型和持续时间的呢?答案是动画时间取决于当前事务的设置,动画类型取决于图层行为。
9.1 事务
事务是通过CATransaction类来做管理,这个类的设计有些奇怪,不像你从它的命名预期的那样去管理一个简单的事务,而是管理了一叠你不能访问的事务。CATransaction没有属性或者实例方法,并且也不能用+alloc和-init方法创建它。但是可以用+begin和+commit分别来入栈或者出栈。
任何可以做动画的图层属性都会被添加到栈顶的事务,你可以通过+setAnimationDuration:方法设置栈顶事务的动画时间,或者通过+animationDuration方法来获取值(默认0.25秒)。
9.3 图层行为
- UIView关联的图层禁用了隐式动画,对这种图层做动画的唯一办法就是使用UIView的动画函数(而不是依赖CATransaction),或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显式动画
- 对于单独存在的图层,我们可以通过实现图层的-actionForLayer:forKey:委托方法,或者提供一个actions字典来控制隐式动画
9.4 呈现与模型
presentationLayer属性,翻译过来叫呈现图层,他代表图层动画过程中的真实值,比如想在动画过程中对图层做一些操作,对象就是xx.layer.presentationLayer 而不是xx.layer本身
两种情况下呈现图层会变得很有用,一个是同步动画,一个是处理用户交互:
- 如果你在实现一个基于定时器的动画(见第11章“基于定时器的动画”),而不仅仅是基于事务的动画,这个时候准确地知道在某一时刻图层显示在什么位置就会对正确摆放图层很有用了
- 如果你想让你做动画的图层响应用户输入,你可以使用-hitTest:方法(见第三章“图层几何学”)来判断指定图层是否被触摸,这时候对呈现图层而不是模型图层调用-hitTest:会显得更有意义,因为呈现图层代表了用户当前看到的图层位置,而不是当前动画结束之后的位置
网友评论