setNeedsLayout & setNeedDisplay

2020-02-23  本文已影响0人  TaoGeNet

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];

参考:
setNeedsLayout & setNeedDisplay

上一篇下一篇

猜你喜欢

热点阅读