iOS 13 引入了新的modalPresentationStyle
,用于以模态呈现的视图控制器…
...并且可以通过将显示的视图控制器向下滑动((交互式关闭))来关闭。即使新的滑动到关闭功能非常有用,也可能并不总是希望如此。所以问题是:
我们如何关闭交互式解雇功能?-记住默认情况下处于启用状态。
答案 0 :(得分:5)
属性isModalInPresentation
可能会有帮助。
从文档中:
当您将其设置为
true
时,UIKit会忽略视图控制器范围之外的事件,并防止视图控制器在屏幕上时被交互关闭。
您可以像这样使用它:
let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
答案 1 :(得分:5)
如果您使用情节提要板来布局UI,我发现使用导航控制器时禁用此交互式解雇的最佳方法是将属性检查器中导航控制器的显示方式从“自动”更改为“全屏”。这样,导航堆栈中的所有视图控制器将全屏显示,并且无法被用户关闭。
Attribute Inspector showing presentation option for the navigation controller
答案 2 :(得分:3)
UIViewController
包含一个名为isModalInPresentation
的新属性,必须将其设置为true
才能防止交互式解雇。
如果
true
,则UIKit会忽略视图控制器范围之外的事件,并防止视图控制器在屏幕上时被交互关闭。默认值为false
。〜简而言之modalInPresentation的官方beta文档。
答案 3 :(得分:2)
如果你有一些业务逻辑,比如在关闭之前应该填写所有字段,你应该:
如果您的 ViewController 已在导航控制器中呈现,则在 ViewDidLoad
上:
func viewDidLoad() {
self.navigationController?.presentationController?.delegate = self
}
如果没有,只需使用
func viewDidLoad() {
self.presentationController?.delegate = self
}
然后实现委托方法:
extension ViewController: UIAdaptivePresentationControllerDelegate {
func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
guard let text = firstName.text, text.isEmpty else { return false }
guard let text = lastName.text, text.isEmpty else { return false }
...
return true
}
}
答案 4 :(得分:0)
如果您希望获得与以前的IOS版本(
let someViewController = \*VIEW CONTROLLER*\
someViewController.modalPresentationStyle = .fullScreen
如果您正在使用情节提要,只需选择segua,然后从Full Screen
下拉列表中选择Presentation
。
如果您只想禁用交互式解雇并将新的演示样式设置为UIViewController
属性isModalInPresentation
设置为true
。
if #available(iOS 13.0, *) {
someViewController.isModalInPresentation = true // available in IOS13
}
答案 5 :(得分:0)
Apple分享了有关它的示例代码at this link
它使用isModalInPresentation
的用户建议。
答案 6 :(得分:0)
现在,您可以为交互手势识别器实现委托,并在尝试与滑块同时进行交互时禁用交互。这样,您可以保持交互式关闭,而滑块可以按预期工作。
您可以像这样禁用向下滑动:
let controller = storyboard?.instantiateViewController(withIdentifier: "NextVC") as! NextVC
let navigationController = UINavigationController(rootViewController: controller)
self.present(navigationController, animated: true, completion: {
navigationController.presentationController?.presentedView?.gestureRecognizers?[0].isEnabled = false
})