Notes

iOS 布局理解

在主 RunLoop 中,包含了一个 Update Cycle

当主 RunLoop 中的事件处理完毕之后,将会进入到 Update Cycle, 对界面进行需要的更新

在 Update Cycle 中,系统会处理 UI 的布局,约束,显示的更新

当我们对某个 view 进行了一次改变,也就是发起了一次改变请求后,系统就会将这个 view 标识为需要重绘,当在下一个 Update Cycle 时,系统就会对之前标记的 view, 根据相应的改变进行更新

在 iOS 系统中,界面的更新频率是 60 fps(Frames Per Second). 即每秒会传输 60 帧的画面。因此,在每次的需要对 UI 进行计算时,都需要在 1/60 秒内完成,否则,就会造成视觉上的卡顿

Layout

layoutSubviews

做什么

调用时机

注意

viewDidLayoutSubviews

调用时机

注意

通知系统 view 的布局状态发生变化

自动通知

手动通知

setNeedsLayout

layoutIfNeeded

调用时机

Display

drawRect

setNeedsDisplay

是什么

displayIfNeeded

Contraints

自动布局中,布局与重绘有三个步骤

  1. 更新约束
    • 系统计算及设置必须的约束
  2. 布局
    • 系统布局系统计算 views 及其 subviews 的 frame 值
  3. 显示
    • 在这一步,将会完成一个 Update Cycle
    • 重绘 views 的内容,如有需要,则调用 drawRect 方法

updateContraints

setNeedsUpdateConstraints

updateConstraintsIfNeeded

invalidateIntrinsicContentSize

References