iOS layoutSubviews调用时机

4,352 阅读2分钟

layoutSubview的作用

layoutSubview的字面意思就是布局子控件。 需要首先需要明确的一点是系统的View并不会在layoutSubview方面里面实现某些代码,如果想要在layoutSubview搞事情,必须要子类去重写该方法 当需要更新subview的frame的时候

layoutSubviews情况分析

  • init初始化不会触发layoutSubviews。
  • addSubview会触发layoutSubviews。

如果addSubview 如果连续2个 只会执行一次,因为一次的runLoop结束后,如果有需要刷新,执行一次即可。

  • 改变一个UIView的Frame会触发layoutSubviews

当然前提是frame的值设置前后发生了变化。

  • 滚动一个UIScrollView引发UIView的重新布局会触发layoutSubviews。
  • 直接调用setNeedsLayout 或者 layoutIfNeeded。

在苹果的官方文档中说明

You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

翻译:layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

iOS layout机制相关方法

- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
——————-

- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
——————–

- (void)setNeedsDisplay
- (void)drawRect

刷新子对象布局

  • layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写

  • setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

  • layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]