iOS 13 为模态呈现的视图控制器引入了
modalPresentationStyle
.pageSheet
(及其兄弟 .formSheet
)的新设计......
…我们可以通过向下滑动呈现的视图控制器来关闭这些工作表(交互式关闭)。尽管新的“拉动关闭”功能非常有用,但它可能并不总是令人满意。
问题:我们如何关闭交互式解雇? - 请记住,我们保持演示风格相同。
viewController.isModalInPresentation = true
(禁用交互式
.pageSheet
解雇行为是这样的。)
UIViewController
包含一个名为 isModalInPresentation
的新属性,必须将其设置为 true
以防止交互式关闭。.popover
等演示样式,请记住这一点。false
。来自官方文档:如果
,UIKit 会忽略视图控制器边界之外的事件,并防止视图控制器在屏幕上时交互式关闭。true
func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
return false
}
UIAdaptivePresentationControllerDelegate
包含一个名为 presentationControllerShouldDismiss
的新方法。isModalInPresentation
属性设置为 false
时,才会调用此方法。提示: 不要忘记分配
的代表。但请注意,众所周知,即使只是访问presentationController
也会导致内存泄漏。presentationController
如果您想要与之前的 iOS 版本相同的行为 (< iOS13) like model presentation in fullscreen, just set the presentation style of your destination view controller to
UIModalPresentationStyle.fullScreen
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
}
房产
isModalInPresentation
可能会有所帮助。
来自文档:
当您将其设置为
时,UIKit 会忽略视图控制器边界之外的事件,并防止视图控制器在屏幕上时交互式关闭。true
你可以这样使用它:
let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
如果您有一些业务逻辑,例如在解雇之前应填写所有字段之类的内容,您应该:
On
ViewDidLoad
如果您的 ViewController 已在导航控制器中呈现:
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
}
}
我很努力地解决这个问题,但解决方案对我有用是我在**主故事板>检查器>演示>全屏**中选择ViewController默认自动更改全屏
这对我来说是工作
所有解决方案都很好,但就我而言,我需要一个停止移动的选项。 所以这是一个代码。
如果您想阻止移动:
self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = false
如果您想畅通移动:
self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = true