视图控制器生命周期描述于查看 iOS 控制器编程指南 http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html.
简而言之,当-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
将始终使用尚未嵌入视图层次结构的新反序列化视图进行调用。
Update
在这种情况下,之前不清楚,我指出为什么视图的边界没有正确设置-viewDidLoad
。这只是之后-viewDidLoad
视图控制器的视图是否添加到视图层次结构中。这是设置视图的最终帧的时间。
如果您必须使框架具有正确的尺寸,则可以使用 IB 设置您需要的尺寸,或者(如果您不使用 IB)将框架设置为-loadView
。这种方法是有缺陷的,因为它静态地将帧的大小设置为一个可能在之后更改的值。-viewDidLoad
被调用(如通话状态栏之类的东西)。
Update 2
您需要将添加子视图与定位和调整子视图大小分开。
如果您从 Storyboard 或 Nib 加载,那么您是对的,应该添加所需的其他视图-viewDidLoad
。如果您以编程方式加载,则所有子视图都会添加到-loadView
.
第二个任务是定位子视图并调整其大小。首选方法是使用UIView.autoresizingMask http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instp/UIView/autoresizingMask,但为了更精确的布局,KVO https://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.htmlview.bounds 并在视图控制器的视图更改其大小时调整自定义子视图。