View的布局无非就是其在屏幕上的大小与位置,其中UIView有三个重要的布局属性:frame,bounds,center。UIView提供了用来通知系统某个view布局发生变化的方法,也提供了在view布局重新计算后调用的可重写的方法。
1.layoutSubviews()方法
当一个视图“认为”应该重新布局自己的子控件时,它便会自动调用自己的layoutSubviews方法,在该方法中“刷新”子控件的布局。而且这个方法不需要我们手动去调用,而是系统在以下情况自动调用:
- 直接修改 view 的大小时会触发
- 调用
addSubview
会触发子视图的layoutSubviews
- 用户在 UIScrollView 上滚动(layoutSubviews 会在
UIScrollView
和它的父view
上被调用) - 用户旋转设备
- 更新视图的 constraints 这些方式都会告知系统
view
的位置需要被重新计算,继而会调用layoutSubviews
.当然也可以直接触发layoutSubviews
的方法。
2.layouifNeeded()方法
当你“马上”,“立刻”需要刷新布局的时候调用,这时候会立刻调用layoutSubviews()方法,将打了“标记”的视图立刻更新。但是这方法会很消耗性能效率
3.setNeedsLayout()方法
使用setNeedsLayout()方法,不会立刻更新布局,而是在下一个run loop中将带有“标记”的视图更新,此时调用layoutSubviews()方法,这有利于优化性能,并且这个时间间隔并不会长到影响用户体验。
参考: