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

时间:2019-01-05 19:23:01

标签: ios swift uinavigationcontroller nslayoutconstraint modalviewcontroller

我当前正在尝试实现一个自定义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()中进行设置,但这也不起作用,并且会不断以不同的高度触发(如果我打印高度,它有时会返回480,有时会返回0 ,那里的行为很奇怪)。

我想知道针对我的特定情况的最佳方法是什么。任何将我指向正确方向的东西都非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

希望有帮助。