我在我的应用程序中使用了一个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的高度?我的黑客工作,但我认为我在这里缺少一些我真正需要了解的重要内容。非常感谢任何想法。
答案 0 :(得分:1)
不完全确定为什么你必须减去高度两次,但我可以解释为什么你必须这样做。
基本上,在viewDidLoad
中,您的视图控制器及其关联视图不知道它们将在何处使用。这意味着您的视图目前没有超级视图。如果在视图控制器以模态方式呈现,添加到导航堆栈或显示在标签栏中之前设置框架,则视图可能会被移动并调整大小和各种疯狂的东西。这个问题的答案是在viewWillAppear:
中执行布局:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
webView.frame = self.view.bounds;
}
该代码片段将调整Web视图以填充视图控制器所占用的区域,并将在屏幕上显示视图之前立即执行。执行时,self.view
已经过调整,以便考虑导航栏,标签栏,状态栏等。