下图描绘了CALayer和UIView的关系,在UIView中有一个layer属性作为根图层,根图层上可以放其他子图层,在UIView中所有能够看到的内容都包含在layer中:
UIView在显示的时候(发生在ViewDidLoad之后)会创建自己的根图层对象,根图层对象会自动创建一个CGContextRef (CALayer 本质使用的是位图上下文),同时调用图层代理(UIView创建图层的同时会设置其代理为自身,所以UIView的它的CALayer对象的代理)的draw: inContext:方法并将图形上下文作为参数传递给这个方法,而在UIView的draw:inContext:方法中会调用其drawRect:方法,在drawRect:方法中使用UIGraphicsGetCurrentContext()方法得到的上下文正是前面创建的上下文。
所以说在使用Quartz 2D在UIView中绘制图形的本质也是绘制到图层中,它的根图层
在CALayer中绘图和在UIView中绘图的区别是前面是绘制到了当前的图层,用UIView绘图是绘制到了根图层中,在子CALayer中绘图的时候需要手动调用setNeedDisplay方法才会绘图
在子CALayer中绘图有两种方法:
1.使用代理方法绘图
通过代理方法进行图层绘图只要指定图层的代理,然后在代理对象中重写-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx方法即可。需要注意这个方法虽然是代理方法但是不用手动实现CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的setNeedDisplay方法,否则绘制的内容无法显示。
2.使用自定义图层绘图
在自定义图层中绘图时只要自己编写一个类继承于CALayer然后在drawInContext:中绘图即可。同前面在代理方法绘图一样,要显示图层中绘制的内容也要调用图层的setNeedDisplay方法,否则drawInContext方法将不会调用。
网友评论