如何在没有状态栏重叠的情况下在iOS7上显示视图控制器

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

现有的导航

要求:

  • 新视图必须出现“模态”,即我需要presentViewController。

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

  • 它必须在iOS 6上工作。

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

选项:

A.将视图的框架向下移动一点。

呃,我们是否回到了iOS 5以前的版本,并且使用了相框? 另外,与自动布局混合通常不是一个好主意。

B.在导航栏下方添加一点空隙。

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

导航与差距

C.以编程方式添加约束。

主要的缺点是你将不得不使用约束和计算导航和状态栏的高度。 呸。

D.拉伸导航栏/工具栏的高度以包含状态栏的区域。

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

在这里输入图像说明

E.在IB中与iOS6 / 7三angular洲混淆。

多个缺点:你会硬编码的ios6 / 7三angular洲。 也不适用于自动布局。

F.使用嵌套的UINavigationController。

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

uinavcontroller解决方法

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

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

优点:

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

缺点:

  • 你可能会想让你的XIB空导航栏或工具栏,并编程添加UIBarButtonItems到导航栏。 幸运的是,这很容易。

您需要从最顶层视图向顶层布局指南中添加垂直约束 ,如Apple以下文章中所述。

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

在这里输入图像说明

接下来的代码为我工作。 只要把它放在提供新控制器的控制器上即可。

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

打开你的xib文件并selectviewcontroller。 在检查器选项卡中select属性并在TopBar“不透明导航栏”中select。 这为我解决了这个问题。