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

时间:2010-12-20 18:33:03

标签: iphone uiwebview uinavigationbar

我在我的应用程序中使用了一个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的高度?我的黑客工作,但我认为我在这里缺少一些我真正需要了解的重要内容。非常感谢任何想法。

1 个答案:

答案 0 :(得分:1)

不完全确定为什么你必须减去高度两次,但我可以解释为什么你必须这样做。

基本上,在viewDidLoad中,您的视图控制器及其关联视图不知道它们将在何处使用。这意味着您的视图目前没有超级视图。如果在视图控制器以模态方式呈现,添加到导航堆栈或显示在标签栏中之前设置框架,则视图可能会被移动并调整大小和各种疯狂的东西。这个问题的答案是在viewWillAppear:中执行布局:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    webView.frame = self.view.bounds;
}

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