美文网首页
基础(一):layoutSubviews

基础(一):layoutSubviews

作者: 小希嘻 | 来源:发表于2017-12-20 15:38 被阅读24次

    UIView的setNeedsDisplaysetNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。 而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
    综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。

    • 先大概看下ios layout机制相关的这几个方法:
    - (CGSize)sizeThatFits:(CGSize)size
    - (void)sizeToFit
    ——————-
    - (void)layoutSubviews
    - (void)layoutIfNeeded
    - (void)setNeedsLayout
    ——————–
    - (void)setNeedsDisplay
    - (void)drawRect
    

    layoutSubviews在以下情况下会被调用:

    1、init初始化不会触发layoutSubviews。
    2、addSubview会触发layoutSubviews。
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
    4、滚动一个UIScrollView会触发layoutSubviews。
    5、旋转Screen会触发父UIView上的layoutSubviews事件。
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
    7、直接调用setLayoutSubviews。
    8、直接调用setNeedsLayout。
    在苹果的官方文档中强调:You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want. 
    layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。
    反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。
    
    刷新子对象布局
    -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
    -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
    -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)
    如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局
    在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]
    

    相关文章

      网友评论

          本文标题:基础(一):layoutSubviews

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