当
UIView
调用
setNeedDisplay
之后,
系统会调用
view
对应
layer
的
setNeedsDisplay,
在当前runloop
即将结束的时候调用CALayer
的display
方法.
CALayer
的display
方法的内部实现,首先会判断layer
的delegete
是否响应display
方法,如果代理不响应就会进入到系统的绘制流程当中,如果响应,实际上就为我们提供了异步绘制的接口,这样就构成了UIView的绘制原理
系统绘制流程:
CALayer
会在内部创建一个
backing store(CGContextRef)
,我们一般在
drawRect
中可以通过上下文堆栈当中拿到当前栈顶的
context
.然后
layer
判断是否有代理,如果没有代理会调用
layer
的
drawInContext
方法,如果实现了代理就会调用
delegete
的
drawLayer:inContext
方法,这是在发生在系统内部当中的,然后在合适的时机给予回调方法,也就是
View
的
drawRect
方法.可以通过
drawRect
方法做一些其他的绘制工作.然后无论哪两个分支,都有
calayer
上传
backing store
(最终的位图)到
CPU
.然后结束系统的绘制流程.
异步绘制流程:
借用系统给开的这个口子,即[layer.delegate displayLayer:]
-
在这个异步绘制过程中就需要代理商负责生成对应的bitmap(位图)
-
同时设置bitmap作为layer.contents属性的值