作为ViewController的根视图view,其上边儿呈现给用户内容,但是一般都是以滚动视图tableView和collectionView为主要视图。一直以来,小编都在viewDidLoad此编程时机去布局页面。后来慢慢的发现这样的代码不容易维护,界面的创建和布局应尽量能够分开,这样一来,代码结构条理、思路清晰,而且易于迭代(比如动态布局self.View的子视图)。如下图所示:
在viewWillAppear此编程时机之后,系统又提供了viewWillLayoutSubviews这个编程时机来布局self.view的子视图,在这里我们就可以动态的实现self.view的子视图布局了。
但是需要注意一点:viewWillLayoutSubviews并不是每次切换视图都调用,见下图。
官方文档说明---When a view's bounds change, the view adjusts the position of its subviews. Your view controller can override this method to make changes before the view lays out its subviews. The default implementation of this method does nothing.(当一个视图的边界发生变化,也就是调整其子视图的位置。你的视图控制器可以重写此方法在layoutSubViews之前生效以重新布局子视图。该方法的默认实现不执行任何操作。)
也就是说:有以下几种情况会调用(init初始化不会触发layoutSubviews)
1、addSubview会触发viewWillLayoutSubviews
2、设置self.view及子视图的frame.size会触发layoutSubviews,当然前提是frame.size的值设置前后发生了变化,注意,此处不是origin,呼应官方文档上的边界发生变化
3、滚动一个UIScrollView(该scrollview有子视图的时候)会触发layoutSubviews
4、横竖屏幕切换会触发