21

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

现有导航

要求:

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

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

  • 它必须在 iOS 6 上运行。

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

选项:

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

呃,我们是不是又回到了 iOS 之前的 5 天并开始使用框架?此外,与自动布局混合通常不是一个好主意。

B. 在导航栏下方的顶部添加一个小间隙。

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

导航有间隙

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

主要缺点是您必须处理约束并计算导航和状态栏高度。呸。

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

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

在此处输入图像描述

E. 与 IB 中的 iOS6/7 增量混淆。

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

F. 使用嵌套的 UINavigationController。

这是我选择的解决方法。请参阅下面的答案。

uinavcontroller 解决方法

4

4 回答 4

29

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

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

好处:

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

缺点:

  • 您可能希望让您的 XIB 没有导航栏或工具栏,并以编程方式将 UIBarButtonItems 添加到导航栏。幸运的是,这很容易。
于 2013-09-20T08:38:39.667 回答
8

您需要按照 Apple 的以下文章中所述将最顶部视图中的垂直约束添加到顶部布局指南。

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

在此处输入图像描述

于 2013-09-24T15:39:26.923 回答
3

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

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
于 2013-11-20T23:59:55.283 回答
0

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

于 2013-09-20T09:19:38.200 回答