当另一个视图控制器显示在它上面时,UIPresentationController 会改变大小

Posted

技术标签:

【中文标题】当另一个视图控制器显示在它上面时,UIPresentationController 会改变大小【英文标题】:UIPresentationController changes size when another view controller is displayed on top of it 【发布时间】:2015-09-25 23:56:01 【问题描述】:

我正在使用 UIPresentationController 展示一个模态视图控制器。我使用以下方法将presentView的框架设置为小于containView的边界:

override func frameOfPresentedViewInContainerView() -> CGRect 
    let myDX = (self.containerView!.bounds.width - 600)/2
    let myDY = (self.containerView!.bounds.height - 600)/2
    return self.containerView!.bounds.insetBy(dx: myDX, dy: myDY)

到目前为止,一切都很好。

现在,我在当前显示的模态视图控制器顶部以模态方式(默认不是自定义)呈现另一个视图控制器,它占据了整个屏幕。因此,我在覆盖整个屏幕的默认模态视图控制器下方有一个自定义模态视图控制器。

问题是当我关闭覆盖整个屏幕的顶视图控制器时,我的自定义视图控制器也会显示覆盖整个屏幕。我希望我的自定义视图控制器的大小保持不变(小于 containerView)。有什么办法可以做到这一点。

任何帮助将不胜感激

【问题讨论】:

也许您可以使用 autoLayout 而不是硬编码框架尺寸? ios 12 中,我可以通过将 presentationStyle 更改为 overCurrentContext 而不是 currentContext 来解决此问题 【参考方案1】:

我遇到了同样的问题。我无法通过添加约束来解决它,并且调用-[UIPresentationController containerViewWillLayoutSubviews] 为时已晚(在关闭动画完成后)。

一段时间后,我发现问题似乎是当您使用默认 UIModalPresentationFullScreen presentationStyle 呈现时,呈现控制器视图正在从视图层次结构中删除,并在具有全屏尺寸时再次添加再次显示。

在 iOS 8 中,当从较小的控制器进行演示时,您可以使用 UIModalPresentationOverFullScreen 作为 presentationStyle。系统不会自动移除呈现控制器的视图。 (-[UIViewController viewWillDisappear:] 等,当您执行此操作时不会在呈现控制器上调用)

您也可以使用 iOS 7 中提供的UIModalPresentationCustom,但您必须提供自己的过渡动画。

【讨论】:

以上是关于当另一个视图控制器显示在它上面时,UIPresentationController 会改变大小的主要内容,如果未能解决你的问题,请参考以下文章

可可触摸试图在它再次弹出之前延迟uiview的动画

当另一个应用程序打开 Safari 视图控制器时,如何让 branch.io 通用链接工作?

当另一个类完成处理所需数据时如何中断 Viewcontroller

使用滚动视图和页面控制?

如何使视图控制器可滚动?

如何创建一个 div,它默认显示图片,但当您将鼠标悬停在它上面时会转换为一些文本细节?