主要讨论一下自定义view中layoutSubviews
的调用时机以及布局的一些tips.
先看官方文档
Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout() method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded() method.
翻译:
子类可以根据需要重写此方法,以便对其子视图执行更精确的布局。仅当子视图的自动调整大小和基于约束的行为无法提供所需的行为时,才应重写此方法。可以使用实现直接设置子视图的框矩形。
不应直接调用此方法。如果要强制更新布局,请在下一次图形更新之前调用setNeedsLayout()方法。如果要立即更新视图的布局,请调用layoutIfNeeded()方法。
-
时机1
当自定义view 被添加到父view时
-
时机2
当自定义view的size发生改变时,注意仅当Origin改变时不会执行
-
时机3
当自定义view自身添加子控件时
-
时机4
当自定义view上面的子控件size反生改变时
时机5
当屏幕旋转时会调用tips
当自身view认为需要重新布局时 都会调用layoutSubviews,而且我们能拿到view的frame,我们就可以动态的进行布局的计算,这也是一种适配的策略,在layoutSubviews中我们可以重新设置子控件的布局,但是不应该把子控件的初始化放在里面,可以在init的时候对控件进行懒加载,然后在layoutSubViews里面设置frame,当你使用约束进行布局时,可以不使用layoutSubviews这个方法,直接在addsubview之后添加约束即可。
不足之处 欢迎补充