UITabBarController的子视图控制器UINavigationController会留下间隙

7
在我的应用程序中,我有一个UITabBarController作为根视图。我有一个两步骤的模态视图,将使用导航控制器进行导航。当我将UINavigationController作为UITabBarController的子级添加时,我的导航控制器底部留下了一个选项卡大小的间隙。请参见附加的图像(抱歉丑陋,仅供演示)。

enter image description here

在这张图片中,底部的白色条是选项卡栏,蓝色背景是当前选定选项卡的视图控制器。黄色是导航控制器中包含的视图控制器。红色间隔是添加导航控制器作为选项卡栏控制器的子控制器时创建的间隙。

只有当选项卡栏设置为不透明时才会发生这种情况。对于导航控制器的扩展布局边缘并没有影响。似乎无论我做什么,都会留下这个间隙,我不能对其进行太多操作。

我以一种非常简单的方式添加了导航控制器:

    addChildViewController(navigationController)
    view.addSubview(navigationController.view)
    navigationController.view.setTranslatesAutoresizingMaskIntoConstraints(false)

    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-20-[view]-20-|", options: nil, metrics: nil, views: ["view" : navigationController.view]))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-100-[view]-100-|", options: nil, metrics: nil, views: ["view" : navigationController.view]))

如果我在应用程序代理中将导航控制器设置为根视图控制器,则它会正确显示,没有底部的间隙。这是选项卡栏和导航控制器之间交互的错误吗?还是我可以做些什么来防止这种情况发生?
1个回答

21

导航中包含的视图控制器需要设置扩展边缘。此外,extendedLayoutIncludesOpaqueBars 必须在包含的视图控制器上设置为 true。我已将以下内容添加到将包含在导航控制器中的视图控制器中:

edgesForExtendedLayout = UIRectEdge.Bottom
extendedLayoutIncludesOpaqueBars = true

谢谢你的答复。你知道这是为什么吗? - dave234
@Dave 我从来没有真正弄清楚“为什么”,它可以工作,所以我就继续了。似乎子视图控制器期望底部的标签栏并为其腾出空间,即使视图控制器的定位意味着不应考虑它。 - Sean Kladek
@SeanKladek - 你是我的英雄。如果我能投100次赞,我会这样做的。 - Jim
我遇到了同样的问题,唯一需要设置的是:extendedLayoutIncludesOpaqueBars = true这是在XCode 10.2.1上,navigationVC是UITabBarController显示的VC的子级。 - orangemako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接