mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
feature: dyld && LD 链接器
This commit is contained in:
@@ -1,5 +1,60 @@
|
||||
# iOS 界面渲染流程
|
||||
|
||||
> 下面几个问题你熟悉吗?
|
||||
>
|
||||
> - 为什么调用 `[UIView serNeedsDisplay]` 并没有立刻发生当前视图的绘制工作?
|
||||
|
||||
|
||||
|
||||
## 视图显示原理
|
||||
|
||||
为什么调用 `[UIView setNeedsDisplay]` 并没有立刻发生当前视图的绘制工作?
|
||||
|
||||
UIView 绘制流程。
|
||||
|
||||
<img src="./../assets/UIViewRefreshProcess.png" style="zoom:60%" />
|
||||
|
||||
|
||||
|
||||
当调用 UIView `[UIView setNeedsDisplay]` 方法时,系统会立刻调用其 Layer 的同名方法 `[view.layer setNeedsDisplay]` 方法,之后相当于给当前 Layer 打上一个脏标记,之后会在当前 RunLoop 快要结束的时候才会调用 Layer 的 `[CALayer display]` 方法。然后进入当前 UIView 真正的绘制流程中。
|
||||
|
||||
其次,会判断 CALayer 的代理,有没有实现 `displayLayer:` 方法,如果没有实现,则进入系统的绘制流程中;如果实现了,则可能是异步绘制或者自定义渲染的实现。
|
||||
|
||||
Tips:`[UIView setNeedsDisplay]` 之后并不会立马调用 `[view.layer setNeedsDisplay]` 方法。要么手动触发 `[view.layer setNeedsDisplay]` 要么,调用一下 `-(void)drawRect:(CGRect)rect` 方法(即使是空实现也没关系)。
|
||||
|
||||
下面来个 Demo 展示下简单的异步绘制一个 String。
|
||||
|
||||
<img src="./../assets/AsyncUILabelRender.png" style="zoom:30%" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
接下来看看系统的绘制实现流程:
|
||||
|
||||
<img src="./../assets/UIViewSystemRenderProcess.png" style="zoom:60%" />
|
||||
|
||||
如何实现异步绘制?
|
||||
|
||||
`[layer.delegate displayPlayer:]`
|
||||
|
||||
- 代理负责生成对应的 bitmap
|
||||
- 设置该 bitmap 作为 layer.contents 属性的值
|
||||
|
||||
|
||||
|
||||
<img src='./../assets/AsyncRenderProcessAPI.png' style="zoom:30%" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 渲染机制
|
||||
|
||||

|
||||
|
||||
Reference in New Issue
Block a user