容器视图中的 definesPresentationContext = true 仍然允许在背景视图上使用模态动画

definesPresentationContext = true in container view still allows modal animations over background views

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

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

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

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

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。如果没有容器视图,请添加一个(以提供剪裁)——尽管根据您的描述,我相信有一个(即您在情节提要中配置了它)。