iOS - 从呈现的视图控制器呈现视图控制器会改变其高度

iOS - Presenting a view controller from a presented view controller changes its height

我有两个控制器之间的自定义转换,它的工作方式与 iOS 邮件应用程序很接近,其中一个通过一些实现的滚动行为保持在另一个之上。

如果我从 Presented 视图控制器中显示一个非全屏大小的新视图控制器,然后关闭这个新的 Presented 视图控制器,则之前的 Presented 视图控制器会更改其高度,然后自行调整大小。

我知道这可能有点令人困惑,但请查看下面的 gif 示例。

如您所见,如果我显示此自定义图像选择器然后关闭它,显示它的视图控制器会扭曲到全屏,然后调整为初始值。

如何防止这种情况发生?我希望呈现图像选择器的 ViewController 保持其高度。

关闭后您可以看到正在调整大小。

设置呈现视图控制器大小

因为它是 UIViewControllerAnimatedTransitioning 我创建了一个自定义演示文稿并且它设置的大小有它自己的 identity

class CustomPresentationController: UIPresentationController {

    override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController!) {
        super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    }

    override var frameOfPresentedViewInContainerView: CGRect {
        let containerBounds = self.containerView?.bounds
        let origin = CGPoint(x: 0.0, y: ((containerBounds?.size.height)! * 0.05))
        let size = CGSize(width: (containerBounds?.size.width)! , height: ((containerBounds?.size.height)! * 0.95))
        // Applies the attributes
        let presentedViewFrame: CGRect = CGRect(origin: origin, size: size)
        return presentedViewFrame
    }

    override func containerViewWillLayoutSubviews() {
        presentedView?.frame = frameOfPresentedViewInContainerView
    }
}

有什么提示吗? 谢谢

我认为这就是问题所在。您正在强制使用无法正常工作的帧大小。你应该使用像 preferredContentSize.

这样的东西

您只需将其添加到 CustomPresentationControllerviewDidLoad

或者您也可以尝试 modalPresentationStyle 作为 "Over Current Context"

您可以参考很好的示例,了解如何使 VC 的某些部分保持透明 here