在主 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 上进行调用手动通知
setNeedsLayoutlayoutIfNeededlayoutSubviews 的消耗最小的方法调用时机
layoutSubviewssetNeedsLayout 或设置了上面能自动通知的属性后,再调用此方法,layoutSubviews 将会在那些需要更新的 view 上调用layoutSubviews 不会被调用layoutSubviews是什么
setNeedsLayout 同性质的方法,用来设置标识dirty, 即会在下一个 Update Cycle 进行重绘。然而,有时候需要间接改变 view 的位置大小,那么此时,就需要调用 setNeedsLayoutlayoutIfNeeded 这种,立即执行的方法自动布局中,布局与重绘有三个步骤
drawRect 方法updateContraints 会经常被调用updateContraints 中应该只实现需要动态变化的约束viewDidLoad 中进行设置updateContraintssetNeedsUpdateConstraints 在下一个 Update Cycle 调用 updateConstraintssetNeedsDisplay, setNeedsLayoutupdateConstraintssetNeedsUpdateConstraints 或 invalidateInstrinsicContentSize 来设置updateConstraints, 而不会等到 RunLoop 的执行顺序intrinsicContentSize 属性,这是根据 view 的内容而获得的大小intrinsicContentSize 可以被重写