2012-10-01 144 views
1

我推视图控制器(mainVC)并添加一些子视图。这些视图中的大部分都是按需构建的,因为用户采取了一些操作。边界和框架大小在viewDidLoad

当我构建每个视图时,我参考mainVC.view.bounds来确定视图的大小。那些建立在需求上的尺寸很好,但第一个(我在viewDidLoad中添加的)似乎没有考虑隐藏的导航栏或非隐藏的工具栏 - 我不确定哪一个。

其他问题似乎可以确保viewDidLoad是指向边界并添加这些子视图的正确位置。我误解了吗?测井产生以下:

viewDidLoad边界高度是548

viewWillAppear边界高度是460(-44×2)。在viewWillAppear我隐藏了导航栏,但前后的高度是一样的。

在以后的所有时间,边界高度是504(-44 x 1)。

为什么边界高度在我试图在viewDidLoad中读取它时没有更新?

+0

我认为当第一次加载笔尖时,视图就是您设置的任意大小。当它作为窗口的子视图结束时,系统会根据它所在的位置(我假设)调整它的大小。请注意,没有“硬”大小 - 我启用了共享功能,因此视图比正常情况下缩短了20个像素。 –

回答

4

视图控制器生命周期在View Controller Programming Guide for 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

您需要将添加子视图的位置和大小子视图分裂。

如果您从故事板或笔尖加载,那么您是正确的,需要在-viewDidLoad中添加所需的其他视图。如果以编程方式加载,则所有子视图都将添加到-loadView中。

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

+0

即使我在创建控制器后立即请求[控制器视图],它也没有区别。首先我创建控制器。其次,我(现在)只是将控制器的视图分配给一个变量 - 只是为了引用它。然后我改变框架。对于任何需求加载的周期,它都可以工作 - 对于主VC中的视图didLoad中触发的任何事件,它都不会。 如果我误解了,并且在您的示例中提到了我的mainVC,那么我如何在启动时加载一些其他视图控制器并添加它们的视图? –

+0

对不起,也许我不清楚'-viewDidLoad'总是会在最后的界限或帧被设置之前被调用。总是。你无能为力。 –

+0

我应该在哪里添加子视图?有鉴于此,似乎我会做很多不必要的后处理。 –