iOS核心动画技巧学习 -- drawRect方法

  1. -drawRect 简介
    1. 除了使用给 contentsCGImage来添加图片,我们也可以使用 Core Graphics 直接绘制.能通过继承 UIView 来实现 -drawRect 实现自定义绘制
    2. -drawRect 默认是没有实现的,因为对 UIView 来说,这个图层的图片不是必须的,它并不在意图层上到底是单调的颜色还是一个图片的实例;如果 UIView 检测到了 -drawRect 方法被调用了,它就会给视图分配一个图层里的图片,这个图层里图片的像素尺寸等于视图大小乘以 contentsScale 的值
    3. 但是如果不需要图层里面的图片,就不要啊创建,因为会造成CPU资源和内存的浪费(苹果也是这样建议的,如果没有自定义的任务就不要在子类中写一个空的 -drawRect 方法)
    4. 视图在屏幕上出现的时候, -drawRect 方法就会自动被调用; 然后我们利用 Core Graphics 绘制图片的方法就是写在这个 -drawRect 方法里面的, 绘制完成后就会被缓存起来直到它需要被更新的时候调用(我们调用了 -setNeedsDisplay),虽然 -drawRectUIView 的,但是事实上都是底层 CALayer 安排了重绘工作和保存了因此产生的图片
    5. 不同于 UIView 的是, CALayer 有一个可选的 delegate 属性,实现了 CALayerDelegate 协议,这是一个 非正式协议 (非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用),就是说我们只需要调用想调用的方法,CALayer会帮我们做剩下的事情
    6. 当需要重绘的时候, CALayer 会请求它的代理给他一个图层里面的图片来显示,它会调用这个方法 - (void)displayLayer:(CALayer *)layer;,如果失败,则会调用 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
    7. 调用这个方法之前, CALayer 创建了一个合适尺寸的空图层(尺寸由 boundscontentsScale 决定)和一个 Core Graphice 绘制上下文环境,给绘制图片做准备,作为参数传进去
  2. 具体使用
    1. 显示调用 -display,因为 CALayer 不同于 UIView 不会自动重绘它的内容,将是否重绘的决定权交给了开发者
    2. 没有使用 masksToBounds 属性,但是绘制的圆仍然被裁剪了,因为使用 CALayerDelegate 绘制的时候,没有提供和对超出边界外的内容提供绘制支持(此处可以用来切圆角)
    3. 但实际上除非创建一个单独的图层,你几乎没有机会用到 CALayerDelegate 协议.因为 UIView创建了图层的时候,会自动将图层的代理设为自己,并提供一个 displayLayer 方法的实现,所有的问题都没了
这个人很帅<br>他什么都不想说<br>