IOS研究之CoreAnimation(2)-CALayer和CATransaction的详细教程

来源:互联网 发布:linux下ibus 编辑:程序博客网 时间:2024/06/05 07:12

CoreAnimation是作用在CALayer上的,本部分总结了CoreAnimation的基础CALayer和CATransaction
一,CALayer
UIView能显示的关键是它有一个CALayer的属性,我们可以通过设置CALayer对象方便的调整UIView的界面效果比如阴影,圆角等。
UIView继承UIResponder,它能响应用户事件。而CALayer直接继承NSObject,只是一个显示的组件。比如如果要显示图片,我们可以使用UIImageView,也可以使用CALayer设置它的contents属性。那UIView和CALayer我们该如何选择使用?对适配器不明白的请看iOS7适配的使用详细说明
如果显示出来的东西需要跟用户进行交互,用UIView;如果不需要跟用户进行交互,推荐使用CALayer,因为的CALayer没有事件处理,性能会高一些。

二,CALayer几个重要的属性和方法
(1)position和anchorPoint
这两个属性确定CALayer的固定位置
masksToBounds,zPosition

(2)drawInContext:
如果是继承CALayer的自定义的CALayer类,实现-(void)drawInContext:(CGContextRef)ctx方法即可。但这个方法不会自动调用,需要执行CALayer的setNeedsDisplay方法触发。
另外,我们还可以使用CALayer的代理方法实现:
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;//NSObject中已经包含了CALayerDelegate的声明,不需要再添加该协议了
以上两种方式都需要显式的执行setNeedsDisplay才能触发。

三,CALayer动画
很多地方讲到CALayer的动画分为隐式动画和显式动画,之前tekuba.net没有都不是很理解怎么回事,今天写了一个Demo测试了下效果,基本上明白了是什么意思。理解如下:
UIView内部关联了一个CALayer,tekuba.net就照着很多文档中说的,暂且叫它“Root CALayer”,所有的非CALayer的“Animatable”属性在修改的时候会默认的产生动画。我们可以打开CALayer.h查看,所有带有“Animatable”标示的属性都有所谓的“隐式动画”,比如self.subLayer.position = CGPointMake(100, 100),这段代码并不是在下一个RunLoop中直接将position修改成(100, 100),而是由一个动画完成这个操作。但注意,这里仅仅指的是非“Root CALayer”,如果是“Root CALayer”,tekuba.net测试的结果是不能产生动画。
如果要对动画进行自定义,就必须使用显式动画,这个时候就用到了CAAnimation了。关于CAAnimation下部分再总结。

四,CATransaction事务
CALayer的“Animatable”属性的设置都应该属于某一个CATransaction事务,CATransaction的作用是保证多个“Animatable”的变化同时进行。也就是说CALayer的属性修改需要依赖CATransaction。
CATransaction也分为隐式和显式。
[隐式]在某次RunLoop中设置了一个“Animatable”属性,如果当前没有设置事务,则会自动创建一个CATransaction,并在当前线程的下一个RunLoop中commit这个CATransaction。
[显式]就是直接调用CATransaction的[CATransaction begin],[CATransaction commit]等相关方法。比如我们不希望self.subLayer.position = CGPointMake(100, 100)产生动画,则可以在CATransaction中设置:

另外事务可以嵌套.当事务嵌套时候,只有当最外层的事务commit了之后,整个动画才开始.

0 0