在主 RunLoop 中,包含了一个 Update Cycle
当主 RunLoop 中的事件处理完毕之后,将会进入到 Update Cycle, 对界面进行需要的更新
在 Update Cycle 中,系统会处理 UI 的布局,约束,显示的更新
当我们对某个 view 进行了一次改变,也就是发起了一次改变请求后,系统就会将这个 view 标识为需要重绘,当在下一个 Update Cycle 时,系统就会对之前标记的 view, 根据相应的改变进行更新
在 iOS 系统中,界面的更新频率是 60 fps(Frames Per Second). 即每秒会传输 60 帧的画面。因此,在每次的需要对 UI 进行计算时,都需要在 1/60 秒内完成,否则,就会造成视觉上的卡顿
做什么
调用时机
注意
调用时机
layoutSubviews
完成后,将会触发控制器中的这个方法注意
viewDidLoad
或 viewDidAppear
自动通知
UIScrollView
, layoutSubviews
会在 UIScrollView
及其 superview 上进行调用手动通知
setNeedsLayout
layoutIfNeeded
layoutSubviews
的消耗最小的方法调用时机
layoutSubviews
setNeedsLayout
或设置了上面能自动通知的属性后,再调用此方法,layoutSubviews
将会在那些需要更新的 view 上调用layoutSubviews
不会被调用layoutSubviews
是什么
setNeedsLayout
同性质的方法,用来设置标识dirty
, 即会在下一个 Update Cycle 进行重绘。然而,有时候需要间接改变 view 的位置大小,那么此时,就需要调用 setNeedsLayout
layoutIfNeeded
这种,立即执行的方法自动布局中,布局与重绘有三个步骤
drawRect
方法updateContraints
会经常被调用updateContraints
中应该只实现需要动态变化的约束viewDidLoad
中进行设置updateContraints
setNeedsUpdateConstraints
在下一个 Update Cycle 调用 updateConstraints
setNeedsDisplay
, setNeedsLayout
updateConstraints
setNeedsUpdateConstraints
或 invalidateInstrinsicContentSize
来设置updateConstraints
, 而不会等到 RunLoop 的执行顺序intrinsicContentSize
属性,这是根据 view 的内容而获得的大小intrinsicContentSize
可以被重写