iPhone X - 隐藏状态栏向上推动导航栏

Posted

技术标签:

【中文标题】iPhone X - 隐藏状态栏向上推动导航栏【英文标题】:iPhone X - Hidden status bar pushes Navigation Bar upwards 【发布时间】:2018-03-11 07:10:29 【问题描述】:

我正在使用 Xcode 模拟器测试 iPhone X 的行为。出于某种奇怪的原因,如果我隐藏状态栏,导航栏会向上推,导致标题完全消失并切断左右按钮。 这只发生在 iPhone X 上

插图:

如何隐藏状态栏并将导航栏保持在可见位置?

更新:

让您信服的示例项目:

https://drive.google.com/file/d/0B5qJARV-Oc9ra1hvZkpXZm9lRUE/view?usp=sharing

【问题讨论】:

你在使用自动布局吗? @Gagan_ios 是的.. 您可以尝试启用“相对于边距”顶部约束吗? @Kerberos 我不认为我有这个选项。导航栏是内置的(我正在做编辑器>嵌入导航控制器),所以它是静态导航栏。我不能拉约束.. 在以前的 iPhone 上,隐藏状态栏为您提供了对您的应用程序有用的空间,因此隐藏它至少在某些类型的应用程序中变得司空见惯。在 iPhone X 上用“耳朵”做一些有用的事情比较困难,因此Human Interface Guidelines 中的建议是:“如果你的应用当前隐藏了状态栏,请重新考虑 iPhone X 上的决定”。 【参考方案1】:

一种解决方案是将导航控制器嵌入到容器视图控制器中,该控制器被适当地限制在安全区域内。

只需创建另一个视图控制器并从对象库中拖动一个“容器视图”。这个视图对安全区域有顶部、底部、前导和尾随约束,所有的常量都等于 0。如果你从容器视图控制拖到导航控制器,你会得到一个选项来设置“嵌入转场” " 这会将选定的视图控制器嵌入为子视图控制器。

我将状态栏设置为在我创建的新视图控制器上隐藏,它工作正常。

这感觉就像UINavigationBar 应该自动处理的事情,但这种解决方法似乎应该工作得很好。

另外注意:如果更改导航栏的颜色,还需要在容器视图上方创建另一个视图,并更改其颜色以匹配导航栏的颜色。

【讨论】:

嘿内森。感谢您提供此答案。如果可以的话,有几个问题:1)你是如何创建包括蜂鸣器等在内的 iPhone 截图的? 2)一般来说,就像你说的那样,这就像Apple没有处理的一个非常基本的场景,我想知道这是否是预期的行为(我不太相信),或者我应该感觉到雷达吗?你怎么看? 1) 我使用Command-Shift-4 截取了模拟器的屏幕截图,然后按下space 并单击模拟器窗口。您可能需要检查 Window > Show Device Bezels。 2)我认为这是一个不常见的用例。通常,如果您使用导航栏,让状态栏可见并没有什么坏处。我预计这不会很快得到解决,因为它违反了常见的 iOS 惯例。 @RoiMulia 我的解决方案对您有用吗?如果您有任何问题,请告诉我。 嘿内森。一般来说,这种解决方法会起作用(不是针对我的具体情况,而是针对更一般的问题)。但正如@Peter E 在 OP 上评论的那样,这可能是一个在 iOS 11.1/xCode 9.1 中解决的错误。你可能会得到赏金,因为你是投票最高的答案 如果没有故事板,您将如何以编程方式执行此操作?【参考方案2】:

对于一个小型应用程序,我从使用 Push 更改为 Modal segue 并添加了我自己的导航栏。我使用 Push 是因为它看起来不错,并且已经有一个 Modal 用于另一部分,出于样式原因我想对其进行不同的动画处理。

对于较小的应用程序,这可能是最快和最简单的解决方案,但我的下一次更新需要使用导航控制器。为此,我想我会打开状态栏,这对我来说没什么大不了的,可以让它工作。

【讨论】:

【参考方案3】:

我认为你需要在 iOS 11 中使用"safeAreaLayoutGuide" 新更新

Apple 为我们提供了必要的 API 来绕过这款 iphone x 的不安全区域。我们通过在代码中使用新的safeAreaLayoutGuide 锚来做到这一点 safeAreaLayoutGuide

【讨论】:

以上是关于iPhone X - 隐藏状态栏向上推动导航栏的主要内容,如果未能解决你的问题,请参考以下文章

隐藏状态栏时,我的导航栏在 iOS7 中向上移动

iOS-导航栏、状态栏及Tabbar高度(区分iPhone X与其他iPhone机型)

隐藏导航栏时显示状态栏

点击设备时如何隐藏状态栏和导航栏

隐藏导航栏将视图“向上”移动

隐藏导航栏会导致视图向上移动