《iOS高级资深工程师面试知识总结》 UI部分3/3 -UIView绘制原理-离屏渲染
一、UIView绘制原理
❓面试考点: 往往出现高级、资深工程师的考点之中
请你说说UIView绘制的原理
1. UIView绘制原理的流程图
- 当我们调用UIView的
setNeedsDisplay
方法时候。
系统会立即调用[view.layer setNeedsDisplay]
方法。相当于在layer上面打上了一个脏标记。
然后再RunLoop即将结束的时候。才会调用[CALayer display]
方法
然后才进入我们视图真正绘制工作流程当中。- 所以我们可以回答说,为什么UIView的调用
setNeedsDisplay
方法并没有立刻发生对应视图的绘制工作。
实际上是。当RunLoop将要结束的时候。才会开始进入视图绘制流程当中。- CALayer的delegate是否会响应
displayLayer
。如果不响应 就进入系统绘制流程
如果CALayer的delegate 响应了displayLayer
方法的时候。 就会进入异步绘制入口
。
2. UIView系统绘制原理
对于系统内部绘制流程
- 内部会创建一个 CALayer creates
backing store
(CGContextRef)
我们可以理解为CGContextRef
,CGContextRef方法当中可以通过上下文获取取出栈顶的context,拿到的就是当前控件的上下文或者是backing store- 然后layer会进行判断。它
是否有代理
如果没有
就会调用[CALayer drawInContext]
如果有
就会调用[layer.delegate drawLayer:inContext:]
- 然后做当前视图的绘制工作 - 发生在系统内部绘制当中的
- 然后再合适的时机给予我们的一个回调方法
[UIView drawRect:]
- drawRect默认实现 其实就是什么都不做的
系统给我们开drawRect的铐子。其实就是允许我们在系统绘制的基础之上。做一些其他的绘制工作。
不管哪两个分支。最终都是由CALayer的backing store 上传到 GPU
最终就结束系统默认的流程
3. 异步绘制
❓面试考点: 是否知道异步绘制、怎么进行异步绘制
待完成
二、离屏渲染
待完成