如何在没有状态栏重叠的iOS7上呈现视图控制器

时间:2013-09-20 08:38:40

标签: ios objective-c uiviewcontroller ios7 statusbar

我看到当我将应用程序迁移到iOS 7时,导出栏在呈现视图控制器时出现在状态栏下。我想很多人都遇到过同样的问题。这是我所看到的截图:

existing nav

要求:

  • 新视图必须"模态",即我需要presentViewController。

  • 显示某种导航栏或工具栏,状态栏采用iOS 7样式导航栏的背景颜色。

  • 它必须适用于iOS 6。

  • 我使用xib处理布局,并启用了自动布局。

选项:

一种。将视图的帧向下移动一点。

呃,我们是否已经回到了iOS之前的5天并且没有框架?此外,与自动布局混合通常也不是一个好主意。

B中。在导航栏下方添加一点间隙。

选项A和B的一个缺点是状态栏不会融入您的导航栏:

nav with gap

℃。以编程方式添加约束。

主要缺点是你必须克服约束并计算导航和状态栏高度。呸。

d。拉伸导航栏/工具栏的高度以包括状态栏的区域。

在iOS 7上看起来不错,但在iOS 6上中断。您需要以编程方式更新导航栏的高度,并确保视图的其余部分正确更新。凌乱。

enter image description here

电子。与IB中的iOS6 / 7增量混淆。

多个缺点:您将对ios6 / 7增量进行硬编码。也不适用于自动布局。

F。使用嵌套的UINavigationController。

这是我选择的解决方法。见下面的答案。

uinavcontroller workaround

4 个答案:

答案 0 :(得分:27)

我发现最简单的解决方法是将您想要显示的视图控制器包装在导航控制器中,然后显示该导航控制器。

MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];

优点:

  • 不需要框架。
  • 相同的代码适用于iOS 6和iOS 7。
  • 比其他解决方法更难看。

缺点:

  • 您可能希望将XIB留空导航栏或工具栏,并以编程方式将UIBarButtonItem添加到导航栏。幸运的是,这很容易。

答案 1 :(得分:7)

您需要在最顶层的视图中添加垂直约束,然后再按照Apple的以下文章中所述热门布局指南

https://developer.apple.com/library/ios/qa/qa1797/_index.html

enter image description here

答案 2 :(得分:2)

下一个代码对我有用。只需将它放在呈现新控制器的控制器上即可。

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

答案 3 :(得分:0)

打开xib文件并选择viewcontroller。在检查器选项卡中选择属性,然后在TopBar“Opaque Navigation Bar”中选择。 这解决了我的问题。