- -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
方法的实现,所有的问题都没了
- 显示调用