setNeedsLayout & setNeedDisplay

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容