layoutSubViews 方法
layoutSubviews 方法是用来设定subview的位置的方法, 是不能手动调用的。只能通过调用setNeedsLayout 方法,来让系统自动调用layoutSubviews方法
If you want to update the layout of your views immediately, call the layoutIfNeeded method.
setNeedDisplay 方法
setNeedsDisplay 调用时, 系统会自动调用 drawRect 方法。
当在操作UI时,比如改变了Frame,更新了UIView/CALayer 的层次的时,或者手动调用了UIVier/CALayer 的setNeedsLayout/setNeedsDisplay方法
后,这个UIView/CALayer就被标记为待处理,并提交到了一个全局的容器里去。
苹果注册了一个Observer监听 BeforeWaiting(即将进入休眠)和 Exit(即将退出Loop)事件,回调去执行一个很长的函数:
_ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv()。这个函数里会遍历所有待处理的UIView/CALayer
以执行实际的绘制和调整,并更新UI界面。
这个函数内部的调用栈大概是这样的:
_ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv()
QuartzCore:CA::Transaction::observer_callback:
CA::Transaction::commit();
CA::Context::commit_transaction();
CA::Layer::layout_and_display_if_needed();
CA::Layer::layout_if_needed();
[CALayer layoutSublayers];
[UIView layoutSubviews];
CA::Layer::display_if_needed();
[CALayer display];
[UIView drawRect];