- -drawRect 简介
- 除了使用给
contents赋CGImage来添加图片,我们也可以使用Core Graphics直接绘制.能通过继承UIView来实现-drawRect实现自定义绘制 -drawRect默认是没有实现的,因为对UIView来说,这个图层的图片不是必须的,它并不在意图层上到底是单调的颜色还是一个图片的实例;如果UIView检测到了-drawRect方法被调用了,它就会给视图分配一个图层里的图片,这个图层里图片的像素尺寸等于视图大小乘以contentsScale的值- 但是如果不需要图层里面的图片,就不要啊创建,因为会造成CPU资源和内存的浪费(苹果也是这样建议的,如果没有自定义的任务就不要在子类中写一个空的
-drawRect方法) - 视图在屏幕上出现的时候,
-drawRect方法就会自动被调用; 然后我们利用Core Graphics绘制图片的方法就是写在这个-drawRect方法里面的, 绘制完成后就会被缓存起来直到它需要被更新的时候调用(我们调用了-setNeedsDisplay),虽然-drawRect是UIView的,但是事实上都是底层CALayer安排了重绘工作和保存了因此产生的图片 - 不同于
UIView的是,CALayer有一个可选的delegate属性,实现了CALayerDelegate协议,这是一个 非正式协议 (非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用),就是说我们只需要调用想调用的方法,CALayer会帮我们做剩下的事情 - 当需要重绘的时候,
CALayer会请求它的代理给他一个图层里面的图片来显示,它会调用这个方法- (void)displayLayer:(CALayer *)layer;,如果失败,则会调用- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; - 调用这个方法之前,
CALayer创建了一个合适尺寸的空图层(尺寸由bounds和contentsScale决定)和一个Core Graphice绘制上下文环境,给绘制图片做准备,作为参数传进去
- 除了使用给
- 具体使用

- 显示调用
-display,因为CALayer不同于UIView不会自动重绘它的内容,将是否重绘的决定权交给了开发者 - 没有使用
masksToBounds属性,但是绘制的圆仍然被裁剪了,因为使用CALayerDelegate绘制的时候,没有提供和对超出边界外的内容提供绘制支持(此处可以用来切圆角) - 但实际上除非创建一个单独的图层,你几乎没有机会用到
CALayerDelegate协议.因为UIView创建了图层的时候,会自动将图层的代理设为自己,并提供一个displayLayer方法的实现,所有的问题都没了