iOS UIView的绘制原理

一、UIView的绘制原理

iOS UIView的绘制原理

  • 当UIView调用setNeedDisplay之后,实际上并没有立即发生位图的绘制工作,而是在之后的某个时机进行当前UI视图的真正绘制工作。
  • 当我们调用UIView的setNeedDisplay方法之后,系统会调用view对应layer的setNeedsDisplay方法,相当于在当前layer上打了一个标记;
  • 在当前runloop即将结束的时候调用CALayer的display方法,然后进入我们视图的真正绘制工作。
  • CALayer的display方法在它的内部实现当中,首先会判断layer的delegate是否响应displayLayer:方法,如果代理不相应就会进入系统的绘制流程当中。如果响应,实际上就为我们提供了异步绘制的接口,这样就构成了UIView的绘制原理。

二、系统绘制流程

iOS UIView的绘制原理

  • 在CALayer内部会创建一个backing store(CGContextRef),我们一般在drawRect中可以通过上下文堆栈当中难道当前栈顶的context;
  • 然后layer会判断是否有代理,如果没有代理会调用layer的drawInContext方法;如果实现了代理就会调用delegate的drawLayer:inContext方法,这是发生在系统内部当中的,然后在合适的时机给予回调方法,也就是view的drawRect方法;
  • 可以通过drawRect方法做一些其他的绘制工作,然后无论哪条分支,都有CALayer上传backing store(最终的位图)到CPU,然后结束系统单的绘制流程。

三、异步绘制流程

iOS UIView的绘制原理

借用系统给开的这个口子,即[layer.delegate displayLayer:]

  • 在这个异步绘制过程中就需要代理商负责生成对应的bitmap(位图)

  • 同时设置bitmap作为layer.contents属性的值