视图控制器生命周期在iOS 视图控制器编程指南中描述。
总之,什么时候-view
叫第一次,什么时候-viewDidLoad
叫。即使视图控制器对视图所做的第一件事就是设置框架,它仍然需要访问视图。
UIViewController *controller = [MyViewController myViewController];
// -viewDidLoad has not been called (if +myViewController doesn't call -view.)
UIView *view = [controller view];
// -viewDidLoad has been called.
view.frame = [UIApplication sharedApplication].delegate.window.bounds;
即使你使用controller.view.frame
相同的逻辑顺序也会发生。-viewDidLoad
将始终使用尚未嵌入视图层次结构的新反序列化视图进行调用。
更新
如果之前不清楚,我指出了为什么在-viewDidLoad
. 只有在-viewDidLoad
视图控制器的视图被添加到视图层次结构之后。这是设置视图的最后一帧的时间。
如果您必须让框架具有正确的尺寸,您可以使用 IB 来设置您知道需要的尺寸,或者(如果您不使用 IB)将框架设置为-loadView
. 这种方法是有缺陷的,因为它静态地将框架的大小设置为在调用后可能会更改的值-viewDidLoad
(例如通话状态栏)。
更新 2
您需要将添加子视图与定位和调整子视图分开。
如果您是从 Storyboard 或 Nib 加载,那么您是正确的,应该在-viewDidLoad
. 如果您以编程方式加载,则所有子视图都添加到-loadView
.
第二个任务是定位和调整子视图。首选方法是使用UIView.autoresizingMask,但为了更精确的布局,KVO view.bounds 并在视图控制器的视图更改其大小时调整您的自定义子视图。