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

标签 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,那里的行为非常奇怪)。

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

最佳答案

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

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

希望对您有所帮助。

关于ios - 显示为模态弹出窗口的 UIViewController 的动态高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055433/

相关文章:

ios - Parse.com UIRemoteNotificationType 已弃用

struct - 如何为 Struct 成员赋值?

ios - 在ios中是否可以让导航栏保持原样,而不是在单击时在 View 层次结构中移动?

uinavigationcontroller - 如何在详细 View 中使用导航 Controller 设置 UISplitView

ios - 导航栏中的多个搜索栏

iOS正确比较文件路径

ios - 从 NSAttributedString 中提取图像

ios - swift UITabbaritem 颜色

ios - 使用 spritekit 无法进行碰撞检测

ios - 使用未解析的标识符 'Messaging' 、 'MessagingDelegate' 、 'MessagingRemoteMessage'