viewDidLoad中的边界和帧大小

Ben*_*ard 2 cocoa-touch uiviewcontroller uiview bounds ios

我推送一个视图控制器(mainVC)并添加一些子视图.大多数这些视图都是按需构建的,因为用户采取了一些操作.

当我构建每个视图时,我指的是mainVC.view.bounds调整视图的大小.根据需求构建的那些大小很好,但第一个(我添加viewDidLoad)似乎没有考虑隐藏的导航栏或未隐藏的工具栏 - 我不确定哪个.

其他问题似乎向我保证,viewDidLoad是引用边界和添加这些子视图的正确位置.我被误导了吗?记录产生以下结果:

viewDidLoad界限高度是548.

viewWillAppear边界高度为460(-44 x 2).在viewWillAppear我隐藏导航栏,但前后的高度是相同的.

以后,边界高度为504(-44 x 1).

为什么在我尝试读取它时,边界高度没有更新viewDidLoad

Jef*_*mas 5

视图控制器生命周期在适用于iOS的View Controller Programming Guide中进行了描述.

简而言之,当-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;
Run Code Online (Sandbox Code Playgroud)

即使你使用controller.view.frame相同的逻辑顺序发生.-viewDidLoad将始终是一个调用新的反序列化视图,该视图尚未嵌入到视图层次结构中.


更新

这种情况早先不清楚,我指出为什么没有正确设置视图边界-viewDidLoad.只有在-viewDidLoad视图控制器的视图添加到视图层次结构之后.这是在设置视图的最后一帧时.

如果必须使框架具有正确的尺寸,则可以使用IB设置您需要的尺寸或(如果不使用IB)设置框架-loadView.这种方法是有缺陷的,因为它静态地将帧的大小设置为可以在-viewDidLoad被调用之后改变的值(诸如在呼叫状态栏之类的内容).


更新2

您需要从定位和大小调整子视图中拆分添加子视图.

如果您从故事板或Nib加载,那么您是正确的,应该添加所需的其他视图-viewDidLoad.如果您以编程方式加载,则会添加所有子视图-loadView.

第二项任务是定位和调整子视图的大小.首选方法是使用UIView.autoresizingMask,但为了更精确的布局,KVO view.bounds并在视图控制器的视图更改其大小时调整自定义子视图.