在容器视图中,导航控制器的导航栏未调整大小以包含状态栏

In a container view, a navigation controller's navigation bar not resizing to include status bar

我创建了一个应用程序,它需要在导航栏和其他视图上方有一个栏。为了实现这一点,我使用了一个视图控制器,顶部栏有一个视图,然后是其他所有内容的容器视图。有时,需要隐藏顶部栏。我正在使用自动布局来隐藏顶部栏(将其高度设置为 0),并且容器视图扩展以填满屏幕(容器顶部等于顶部栏底部)。容器视图包含一个导航控制器,因为有时我需要在顶部栏下方有一个导航栏。当我启动应用程序时,一切正常,如下所示:

如您所见,导航栏保持所需的高度,并扩展到包括状态栏

但是,当点击顶部栏时,我使用 segue 从我的根视图控制器(而不是容器)呈现(而不是推送)一个视图控制器,然后我查看与导航栏相同的屏幕,导航栏不再扩展,它与状态栏重叠,如下所示:

为什么呈现一个视图控制器会破坏这个?那么我该如何纠正或预防呢?

我可以做的一个可能的解决方案是从容器视图中呈现一个视图控制器,这可行,我只需要将容器中的当前视图控制器设置为根控制器的委托,这样当点击顶部栏,它告诉容器中的视图控制器呈现新的视图控制器。但是,这不是我的第一个选择,尤其是在有其他情况导致此问题的情况下。

感谢您的帮助!

您需要关闭所有 child 视图控制器的 automaticallyAdjustsScrollViewInsets 并自行管理插图(或不需要它们的设置)。默认情况下 automaticallyAdjustsScrollViewInsets 对所有视图控制器都是打开的(这是你想要 'full screen' 呈现的 VCs.

目前,随着 VC 层次结构的变化,您会看到控制器几乎是随机更新以针对滚动插图重新组织自身。

我可能会为所有 VC 关闭 automaticallyAdjustsScrollViewInsets(root 除外)并更改您的 header 视图,使其为全高或状态栏高度(应该是根 VC 的 topLayoutGuidelength)。当折叠到状态栏高度时,您的 header 视图也可以更改颜色以匹配当前顶部的颜色 VC。