显示为模态弹出窗口的 UIViewController 的动态高度

Dynamic height for UIViewController shown as modal popup

我目前正在尝试实现一个自定义 UIViewController,其中有一个 UINavigationController。这是一个显示在屏幕底部的模态视图,用户可以通过不同的选项在该模态视图中导航。 UIViewController 的背景设置为透明,因此它显示为已可见屏幕的叠加层。

我现在已经设法像这样设置和展示我的 UIViewController

    let modalController = ModalController()
    modalController.modalPresentationStyle = .overCurrentContext
    self.present(modalController, animated: true, completion: nil)

在这个UIViewController里面我这样做:

var popupController: UINavigationController = {
    let popupController = UINavigationController(rootViewController: ModalStart())
    return popupController
}()

var modalPopup: UIView = {
    let modalPopup = UIView()
    modalPopup.translatesAutoresizingMaskIntoConstraints = false
    modalPopup.backgroundColor = .white
    modalPopup.isUserInteractionEnabled = true
    return modalPopup
}()

view.addSubview(modalPopup)
modalPopup.addSubview(popupController.view)

modalPopup.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
modalPopup.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
modalPopup.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
modalPopup.heightAnchor.constraint(equalToConstant: 500).isActive = true

这很好用,但您可能已经猜到了,高度设置为固定常量 500。这适用于我的 iPhone X,但在 iPhone 5s 上会有所不同,因为例子。当我浏览 UINavigationController 时,它也不允许我相应地更改高度,因为不同 viewControllers 的高度会不同。

有人知道我怎样才能做到这一点吗?我已经在 rootViewController (ModalStart) 中添加了自定义 ContainerView,但我无法直接访问 popupController.containerView.frame.height(因为 popupController 是 UINavigationController)。我还尝试使 heightAnchor 成为一个变量并将其设置在 ModalStart() 的 viewDidLayoutSubviews() 中,但这也不起作用,并且会不断地以不同的高度触发(如果我打印高度,它有时会 returns 480,有时为 0,那里的行为非常奇怪)。

我想知道适合我的具体情况的最佳方法是什么。非常感谢任何指向正确方向的东西!

我将向您展示一种简单的方法。据我所知,最好的方法是为 modalView 使用数据源模型并从那里计算高度。例如,如果您有一张图像和一个标签,它们的高度是已知的,如果不能计算,您可以将其作为 modalView 的数据源发送。现在,如果下一个 modalView 将只有 6 个标签,那么再次很容易计算出适合所有标签所需的高度。通过使用数据源模型,您可以在过渡发生到下一个 modalView 之前预先计算所有高度。我在这里为您整理了一个简单的示例:https://github.com/galots/VariableModal

如果您单击 Present 按钮,将显示新的 viewController 并显示带有初始约束的 modalView。然后,如果您单击“下一步”,模态视图高度将相应地更新为数据源。在这种情况下,dataSource 只是一个 CGFloat 的数组,只是为了便于理解。另外,请注意 modalView 是 UIView 的子类,因此您可以根据需要更新其高度约束。

希望对您有所帮助。