显示为模态弹出窗口的 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
的子类,因此您可以根据需要更新其高度约束。
希望对您有所帮助。
我目前正在尝试实现一个自定义 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
的子类,因此您可以根据需要更新其高度约束。
希望对您有所帮助。