为什么我必须减去UINavigationBar的高度两次以使UIWebView的大小正确?

我在我的应用程序中使用UINavigationBar与三个不同的UIViewControllers。通过在RootViewController.m中实现以下内容,RootViewController在其视图位于堆栈顶部时隐藏导航栏:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:TRUE animated:TRUE];}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];

[self.navigationController setNavigationBarHidden:FALSE animated:TRUE];}
当firstViewController被推到顶部时,一切正常。在IB中,我告诉这个视图,它有一个状态栏和一个导航栏。它的所有子视图(在IB中添加)都按照预期在模拟器和设备上进行布局。 然而,当secondViewContoller被推到顶端时,事情变得奇怪了。在IB中,我告诉视图,状态栏和导航栏就像以前一样。我添加了一个UIWebView来填充屏幕的其余部分(在IB中验证尺寸为320 x 416)并且它在IB中看起来都是正确的。我在模拟器和我的设备上运行了应用程序,UIWebView在导航栏后面运行,好像它是320 x 460。 要解决此问题,我将此代码添加到SecondViewController.m:
- (void)viewDidLoad {
[super viewDidLoad];

[webView setFrame:CGRectMake(0.0, 44.0, 320.0, 372.0)]; }
现在,在模拟器和设备上运行时,它们看起来都很好。但这不对!高度确实是416,而不是372.为什么我必须两次减去UINavigationBar的高度?我的黑客工作,但我认为我在这里缺少一些我真正需要了解的重要内容。任何想法都非常感谢。     
已邀请:
不完全确定为什么你必须减去两次高度,但我可以解释为什么你必须这样做。 基本上,在
viewDidLoad
中,您的视图控制器及其相关视图不知道它们将在何处使用。这意味着您的视图目前没有超级视图。如果在视图控制器以模态方式呈现,添加到导航堆栈或显示在标签栏中之前设置框架,则视图可能会被移动并调整大小和各种疯狂的东西。这个问题的答案是在
viewWillAppear:
中执行布局:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    webView.frame = self.view.bounds;
}
该代码片段将调整Web视图以填充视图控制器所占用的区域,并将在屏幕上显示视图之前立即执行。执行时,
self.view
已经调整为占用导航栏,标签栏,状态栏等。     

要回复问题请先登录注册