在容器视图中,导航控制器的导航栏不会resize以包含状态栏

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

在此处输入图像描述

如您所见,导航栏保持所需的高度,该高度已扩展为包含状态栏

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

在此处输入图像描述

为什么呈现视图控制器会打破这个? 然后我怎么能纠正这个或阻止它呢?

我可以做的一个可能的解决方案是在容器视图中提供一个视图控制器,它可以工作,我只需要将容器中的当前视图控制器设置为根控制器的委托,这样当点击顶部栏时,它告诉容器中的视图控制器呈现新的视图控制器。 然而,这不是我的第一个选择,特别是如果有其他情况导致此问题。

谢谢你的帮助!

您需要为所有子视图控制器automaticallyAdjustsScrollViewInsets关闭AdjustsScrollViewInsets,并自行管理插入(或设置以便不需要它们)。 默认情况下,所有视图控制器都启用了automaticallyAdjustsScrollViewInsets循环播放设置(这是您想要的’全屏’呈现的VC。

目前,当VC层次结构发生变化时,您会看到控制器几乎随机更新以重新组织自己的滚动插入。

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