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]
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END