美文网首页
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