一. UIViewController
UIViewController的View是lazy loading的,只有访问其view属性时,view才会加载(通过xib载入或者loadView方法中代码实现),可以通过UIViewController的isViewLoaded来判断其View是否已经加载。
当UIViewController的view将要被加入到view hierarchy中时,viewWillAppear会被调用,完成加入时,viewDidAppear会被调用。将view从 view hierarchy中移除时,分别调用viewWillDisappear/viewDidDisappear回调方法。
这里需要注意一点,在viewDidLoad/loadView以及viewWillAppear/viewDidAppear中,获取的UIViewController的view的frame都是不一定是准确的最终的frame,只有在UIViewController的viewDidLayoutSubviews回调中,才可以准确获取UIViewController的view的frame。
二. Hierarchy & Container View Controller
如上图,View有一个View Hierarchy,同时,View Controller也有一个View Controller Hierarchy。一般情况下,View Hierarchy 和 View Controller Hierarchy需要保持一致性。
负责一个或多个 View Controller 的展示并对其视图生命周期进行管理的对象,称之为容器,大部分容器本身也是一个View Controller,这样的容器称为 Container View Controller。常见的容器有 UINavigationController,UITabbarController等。
例如,UINavigationController的view and view controller hierarchy关系图: