我推送一个视图控制器(mainVC
)并向其添加一些子视图。大多数这些视图都是按需构建的,因为用户会采取一些措施。
当我构建每个视图时,我引用mainVC.view.bounds
来调整视图大小。根据需求构建的那些大小很好,但第一个(我在viewDidLoad
中添加)似乎没有考虑隐藏的导航栏或未隐藏的工具栏 - 我不确定哪个。 / p>
其他问题似乎向我保证viewDidLoad是引用边界和添加这些子视图的正确位置。我被误导了吗?记录产生以下结果:
在viewDidLoad
中,边界高度为548。
在viewWillAppear
中,边界高度为460(-44 x 2)。在viewWillAppear
中,我隐藏了导航栏,但前后的高度相同。
以后,边界高度为504(-44 x 1)。
为什么我尝试在viewDidLoad
中读取边界高度时没有更新边界高度?
答案 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并在视图控制器的视图更改其大小时调整自定义子视图。