2

我推送一个视图控制器 ( mainVC) 并向其中添加一些子视图。当用户采取一些行动时,大多数这些视图都是按需构建的。

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

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

viewDidLoad边界高度为 548 。

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

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

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

4

1 回答 1

5

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

您需要将添加子视图与定位和调整子视图分开。

如果您是从 Storyboard 或 Nib 加载,那么您是正确的,应该在-viewDidLoad. 如果您以编程方式加载,则所有子视图都添加到-loadView.

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

于 2012-10-02T00:59:38.140 回答