Swift 容器视图中的DefinePresentationContext=true仍然允许在背景视图上进行模式动画

Swift 容器视图中的DefinePresentationContext=true仍然允许在背景视图上进行模式动画,swift,uikit,ios-animations,Swift,Uikit,Ios Animations,在我的代码中,我使用present(:animated:completion:)方法从ViewController1显示ViewController2,ViewController1是嵌套在RootViewController中的容器视图的根视图控制器 我已将演示样式设置为.coverVertical,并且在ViewController1的viewDidLoad()方法中将其definesPresentationContext变量设置为true。我还将ViewController2的演示文稿设置

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

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


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

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

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

let vc = // ViewController2 instance, obtained somehow
vc.modalTransitionStyle = .coverVertical
self.definesPresentationContext = true
vc.modalPresentationStyle = .currentContext
self.present(vc, animated: true)
您将看到,转换只涉及ViewController1视图的区域


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

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

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

let vc = // ViewController2 instance, obtained somehow
vc.modalTransitionStyle = .coverVertical
self.definesPresentationContext = true
vc.modalPresentationStyle = .currentContext
self.present(vc, animated: true)
您将看到,转换只涉及ViewController1视图的区域


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

没有UIViewController
definesCurrentContext
变量。这是你刚刚编的吗?表示该变量,将编辑OPVIEWCONTROLLER
definesCurrentContext
变量。这是你刚刚编的吗?表示此变量,将编辑OPYeah,但将其更改为
let vc=//ViewController2实例,以某种方式获得
vc.modalTransitionStyle=.coverVertical
self.definesPresentationContext=true
self.present(vc,动画:真)并且它在正确的位置结束,但是coverVertica动画从屏幕底部开始,至少对我来说是这样,因为你没有打开容器视图的
clipsToBounds
。我将把它添加到我的答案中。但是自定义的过渡动画会给你更多的控制。基本上你不喜欢默认的
Covertical
动画,现在你正试图破解它,你可以很容易地用自己的任何动画替换它。所以最终目标是使用自定义动画,但我只希望自定义动画在ViewController1的范围内进行。当然,第一步是让本机动画正常工作,这就是问题所在。在我想展示的自定义动画中,UIViewControllerImagedTransitioning类中提供的transitionContext应该只能让我将UIViews放在ViewController1的范围内。我感觉这并不能解决这个核心问题,因为clipsToBounds只会让一切变得糟糕部分不可见,但我不确定如何正确地为transitionContext提供它需要的上下文,以使
viewFor(key:.to)
具有一个点(0,0)在ViewController1Yeah的左上角,但将其更改为
让vc=//ViewController2实例,以某种方式获得
vc.modalTransitionStyle=.coverVertical
self.definesPresentationContext=truevc.modalPresentationStyle=.currentContext
self。当前(vc,动画:真)
并且它在正确的位置结束,但是coverVertica动画从屏幕底部开始,至少对我来说是这样,因为你没有打开容器视图的
clipsToBounds
。我将把它添加到我的答案中。但是自定义的过渡动画会给你更多的控制。基本上你不喜欢默认的
Covertical
动画,现在你正试图破解它,你可以很容易地用自己的任何动画替换它。所以最终目标是使用自定义动画,但我只希望自定义动画在ViewController1的范围内进行。当然,第一步是让本机动画正常工作,这就是问题所在。在我想展示的自定义动画中,UIViewControllerImagedTransitioning类中提供的transitionContext应该只能让我将UIViews放在ViewController1的范围内。我感觉这并不能解决这个核心问题,因为clipsToBounds只会让一切变得糟糕部分不可见,但我不确定如何正确地为transitionContext提供它所需的上下文,以便
viewFor(键:.to)
在ViewController1的左上角有一个点(0,0)