viewDidLoad中的边界和帧大小

时间:2012-10-01 20:14:23

标签: ios cocoa-touch uiview uiviewcontroller bounds

我推送一个视图控制器(mainVC)并向其添加一些子视图。大多数这些视图都是按需构建的,因为用户会采取一些措施。

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

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

viewDidLoad中,边界高度为548。

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

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

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

1 个答案:

答案 0 :(得分:5)

视图控制器生命周期在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

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

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

中添加所有子视图

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