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

Posted

技术标签:

【中文标题】如何在没有状态栏重叠的情况下在 iOS7 上呈现视图控制器【英文标题】:how to present a view controller on iOS7 without the status bar overlapping 【发布时间】:2013-09-25 13:51:27 【问题描述】:

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

要求:

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

显示某种导航栏或工具栏,状态栏采用 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。

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

【问题讨论】:

我有同样的问题,找不到一个干净的方法来快速迁移我的应用程序而不是太脏。我讨厌苹果说“我们决定你应该重写你的整个应用程序,请这样做。” 【参考方案1】:

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

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

优点:

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

缺点:

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

【讨论】:

目前为止对我来说最好的解决方案。 使用此方法与设置顶部布局指南的约束相比的另一个优点是,如果您更改导航栏的色调颜色,颜色将延伸到状态栏下方。使用约束方法,视图的背景将位于状态栏下方。 使用这种方法有问题。我正在使用 [self dismissViewControllerAnimated:YES completion:nil];隐藏它也许这就是问题 我一直在寻找解决这个问题的方法。在我看来,这是最简单的。您可以将导航栏用作某种对话框标题。感谢您发布此内容。 @henrik 很高兴你发现它有用。我花了很多时间试图找出最好/最简单的解决方案,并发布了问题+答案对,希望它可以为其他人节省时间【参考方案2】:

您需要将 Vertical Constraint 从最顶部的视图添加到 Top Layout Guide,如以下 Apple 文章所述。

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

【讨论】:

请注意,Apple 文章仅描述了一种在 IB 中使用情节提要的方法,而不是在原始问题中描述的使用 xib(在 IB 中或以编程方式)的方法。我的应用程序相对复杂,并且混合了故事板(用于更简单的相关视图集合)和 xib。这是故事板的一个很好的解决方案,它是我已经在使用的一种技术。以编程方式添加约束,虽然这是我在需要时做的事情,但可能会变成一罐蠕虫。此外,由于 topLayoutGuide 仅限 iOS 7(iOS 6 是问题中的要求),因此您还需要条件代码。【参考方案3】:

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

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于如何在没有状态栏重叠的情况下在 iOS7 上呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

重叠视图iOS7上的状态栏

iOS 7 和 iOS 8 中 UIImagepickercontroller 的相机视图上的状态栏重叠

如何修复 iOS 7 中的状态栏重叠问题

ios 7子视图UINavigationBar与状态栏重叠..任何简单的解决方案..?

iOS 7 状态栏重叠 UI

iPad 上的状态栏未按预期呈现