1

我因导航栏问题而将头撞到墙上。请参阅此示例项目,以更好地了解我想要实现的目标。基本上,我的应用程序结构是这样的:

NavController -root-> ViewControllerA -> button -> push -> ViewControllerB                            --> ViewControllerC
                                                              |                                      |
                                                            button -> presentModally                 |
                                                              |                                      |
                                                              V                                      |
                                                        PopoverViewController                        |
                                                              |                                      |
                                                            button -> push to the nav controller     |
                                                              |                                      |
                                                              |                                      |
                                                              ---------------------------------------

导航堆栈的第二个视图控制器(称为 B)上的按钮将呈现一个具有清晰背景的模态视图控制器(它的模态呈现样式overCurrentContext看起来像一个弹出框):

视图控制器B

弹出框

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

呈现C

[视图控制器C

弹出框由 B 呈现,而不是实际的导航控制器(B 定义呈现上下文)。这样当弹出框将 C 推入堆栈时,C 不仅覆盖 B,而且还覆盖弹出框。

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

在此处输入图像描述

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

在此处输入图像描述

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

4

3 回答 3

1

您正在手动将视图控制器推送到没有导航控制器的堆栈上。更好的方法是使用 segue 标识符从视图控制器 B 到视图控制器 C。在情节提要中设置 segue 后,您将看到视图控制器 C 自动获得一个导航栏。您可能希望使用从弹出视图控制器到 B 的委托方法来触发 segue。

于 2017-02-23T02:52:01.150 回答
1

我有一个与这个非常相似的问题。我正在使用.overCurrentContext演示模式演示视图控制器。当 viewController 显示时,导航就在它上面!

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

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

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

于 2018-05-31T18:20:08.187 回答
0

迅速 5

我是这样做的:

let vc = viewControllerToDisplay()
let navVc = UINavigationController(rootViewController: vc)

navVc.modalPresentationStyle = .overCurrentContext
navVc.modalTransitionStyle = .crossDissolve

navigationController?.present(navVc, animated: true, completion: nil)
于 2021-09-23T16:50:11.523 回答