美文网首页
setNeedsLayout & setNeedDisplay

setNeedsLayout & setNeedDisplay

作者: TaoGeNet | 来源:发表于2020-02-23 21:30 被阅读0次

    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

    相关文章

      网友评论

          本文标题:setNeedsLayout & setNeedDisplay

          本文链接:https://www.haomeiwen.com/subject/udxeqhtx.html