我当前正在尝试实现一个自定义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 ,那里的行为很奇怪)。
我想知道针对我的特定情况的最佳方法是什么。任何将我指向正确方向的东西都非常感谢!
答案 0 :(得分:0)
我将向您展示一种简单的方法。据我所知,最好的方法是将dataSource模型用于modalView并从那里计算高度。例如,如果您有一幅图像和一个标签,其高度是已知的,并且无法计算高度,则可以将其作为modalView的dataSource发送。现在,如果下一个modalView仅包含6个标签,则再次可以很容易地计算出适合所有标签的高度。通过使用dataSource模型,您可以在过渡到下一个modalView之前预先计算所有高度。我在这里为您整理了一个简单的示例:https://github.com/galots/VariableModal
如果您单击显示为Present的按钮,则将显示新的viewController并以初始约束显示modalView。然后,如果单击“下一步”,则模态视图的高度将相应地更新为dataSource。在这种情况下,dataSource只是editor.foldAll
的数组,只是为了使其易于理解。另外,请注意modalView是CGFloat
的子类,因此您可以根据需要更新其高度约束。
希望有帮助。