0

在我的代码中,我使用 present(:animated:completion:) 方法从 ViewController1 呈现 ViewController2,ViewController1 是嵌套在 RootViewController 中的容器视图的根视图控制器。

我已将演示样式设置为 .coverVertical,并且在其 viewDidLoad() 方法中将 ViewController1 的 definePresentationContext 变量设置为 true。我还将 ViewController2 的演示文稿设置为 .overCurrentContext。这使得 ViewController2 的边界与 ViewController1 的边界相同,但无论出于何种原因,.coverVertical 动画都从屏幕底部开始,而不是从 ViewController1 框架的底部开始。

但是,当我将容器视图的根视图控制器设置为 UINavigationController 并将 ViewController1 嵌套在其中时,这种情况就会消失。我认为这意味着我缺少一些第二个上下文变量,它可以防止动画在其他视图之上进行动画处理,但除了definePresentationContext 之外,我似乎找不到任何其他变量。

4

1 回答 1

2

所以你说你的视图控制器层次结构是

RootViewController
    ViewController1

在这种情况下,在 ViewController1 中运行以下代码:

let vc = // ViewController2 instance, obtained somehow
vc.modalTransitionStyle = .coverVertical
self.definesPresentationContext = true
vc.modalPresentationStyle = .currentContext
self.present(vc, animated: true)

您将看到只有 ViewController1 的视图区域参与了转换。

请注意,clipsToBounds容器视图的必须设置为true。如果没有容器视图,请添加一个(以提供剪辑)-尽管根据您的描述,我相信有一个(即您在情节提要中配置了它)。

于 2018-07-30T20:15:22.887 回答