self.layer.delegate = self ;这个方法不用写,系统默认会设置delegate为当前view
当调用setNeedsDisplay时候,流程如下
[self setNeedsDisplay];
[self.layer setNeedsDisplay];
//.线程上是异步执行,不会阻塞线程,并且在runloop最后一个阶段执行
[self.layer display];//首先回判断代理是否响应这个displayLayer:方法
如果响应就进入异步绘制入口(- (void)displayLayer:(CALayer*)layer) ,
代理负责生成对应的bitmap
设置改bitmap座位layer.contents属性的值
不响应就进入系统绘制流程
系统绘制流程
CALayer creates backingstore
layer 是否有代理layer.delegate方法drawLayer:inContext
没有代理调用系统 CALayer drawInContext:
有代理调用代理方法- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx,如果在里面调用父类方法[super drawLayer:layer inContext:ctx];,就会调用- (void)drawRect:(CGRect)rect。没有调用super drawlayer的话就不会调用drawRect。(需要说明的是如果没有实现 drawRect方法,那么drawLayer:inContext:方法也不会调用)