Ios 将视图控制器显示为overCurrentContext,然后推送到导航堆栈,将导致导航栏的UnderMapping

Ios 将视图控制器显示为overCurrentContext,然后推送到导航堆栈,将导致导航栏的UnderMapping,ios,uinavigationcontroller,uinavigationbar,uimodalpresentationstyle,Ios,Uinavigationcontroller,Uinavigationbar,Uimodalpresentationstyle,我的导航栏问题让我的头撞到了墙上。请看这篇文章,以更好地了解我正在努力实现的目标。基本上,我的应用程序结构如下: NavController -root-> ViewControllerA -> button -> push -> ViewControllerB --> ViewControllerC

我的导航栏问题让我的头撞到了墙上。请看这篇文章,以更好地了解我正在努力实现的目标。基本上,我的应用程序结构如下:

NavController -root-> ViewControllerA -> button -> push -> ViewControllerB                            --> ViewControllerC
                                                              |                                      |
                                                            button -> presentModally                 |
                                                              |                                      |
                                                              V                                      |
                                                        PopoverViewController                        |
                                                              |                                      |
                                                            button -> push to the nav controller     |
                                                              |                                      |
                                                              |                                      |
                                                              ---------------------------------------
导航堆栈第二个视图控制器(称为B)上的按钮将显示背景清晰的模态视图控制器(其模态显示样式为
overCurrentContext
,看起来像一个popover):

然后,popover上的一个按钮将把一个新的视图控制器推到导航堆栈上(称为C):

[

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

解除C时会出现问题。导航堆栈弹回到B,而popover仍在顶部(这是我的意图)。但是,B现在填充导航视图控制器的整个框架(在推C之前,B的顶部固定在导航栏上)。这会导致导航栏剪裁B顶部附近的视图:

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


C出现之前并非如此。您知道是什么导致了这种情况吗?

您正在手动将视图控制器推到没有导航控制器的堆栈上。更好的方法是使用segue标识符从视图控制器B切换到视图控制器C。在st中设置segue后oryboard您将看到视图控制器C自动获取导航条。您可能希望使用从popover视图控制器到B的委托方法来触发segue。

我遇到了一个与此问题非常类似的问题。我使用
.overCurrentContext
呈现模式呈现视图控制器。当视图控制器被禁用时玩导航就在上面

为了解决这个问题,我刚刚要求导航显示新的视图控制器,而不是旧的视图控制器

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

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

我尝试过这样做。从B到C进行了一个
show
segue,并使用了从popover的点击功能到B的委托方法来触发segue。它仍然以同样的方式运行。我还尝试了设置B的
definesPresentationContext
to
false
。这解决了C被剪裁的问题,但它也会导致导航控制器在所有进一步VC被推到堆栈上的基础上呈现popover。我尝试为popover修补不同的
modalPresentationStyles
,但
overCurrentContext
似乎是唯一满足我要求的回忆。偶然解决?