使用overCurrentContext呈现视图控制器然后推送到导航堆栈会导致导航栏重叠

时间:2017-02-23 02:25:10

标签: ios uinavigationcontroller uinavigationbar uimodalpresentationstyle

我用navBar问题撞到墙上。请参阅此sample project以更好地了解我要实现的目标。基本上,我的app结构是这样的:

overCurrentContext

导航堆栈的第二个视图控制器(称为B)上的按钮将呈现具有清晰背景的模态视图控制器(其模态演示样式为max-width看起来像弹出窗口):

ViewControllerB

Popover

然后,弹出窗口上的按钮会将新的视图控制器推送到导航堆栈(称为C):

PresentingC

[ViewControllerC

弹出窗口由B表示,而不是实际的导航控制器(B定义演示文稿上下文)。这样当弹出窗口将C推到堆栈上时,C不仅覆盖B,而且还覆盖了弹出窗口。

当解雇C时出现问题。导航堆栈弹回B,弹出窗口仍位于顶部(这是我的意图)。但是,B现在填充导航视图控制器的整个帧(在C被推动之前,B的顶部被固定到navBar)。这会导致靠近B顶部的视图被navBar剪切:

enter image description here

看看UI Inspector确认这是因为B的视图现在填充了导航控制器的视图:

enter image description here

在提出C之前并非如此。关于是什么导致这种情况发生的任何想法?

2 个答案:

答案 0 :(得分:1)

您正在手动将视图控制器推入没有导航控制器的堆栈。更好的方法是使用segue标识符从视图控制器B切换到视图控制器C.在故事板中设置segue后,您将看到视图控制器C自动获取导航栏。您可能希望使用从弹出视图控制器到B的委托方法来触发segue。

答案 1 :(得分:0)

我遇到的问题非常类似于此问题。我使用.overCurrentContext演示模式呈现视图控制器。当显示viewController时,导航结束了!

为了解决这个问题,我刚刚向导航界展示了新的视图控制器而不是旧的viewController。

viewController.navigationController?.present(navigationController, animated: true, completion: nil)

通过这种方式,viewController将不再位于导航的后面。我希望它有所帮助。