iOS 13为模态呈现的视图控制器引入了modalPresentationStyle .pageSheet(及其兄弟姐妹.formSheet)的新设计…

我们可以通过向下滑动所呈现的视图控制器来取消这些表(交互式取消)。尽管新的“删除”功能非常有用,但它可能并不总是可取的。

问题:我们如何关闭交互式解雇? -请记住,我们保持演示风格不变。


当前回答

如果你正在使用故事板来布局你的UI,我发现在使用导航控制器时禁用这种交互式撤销的最好方法是将导航控制器在属性检查器中的表示从自动更改为全屏。导航堆栈中的所有视图控制器都将是全屏的,用户无法将其解散。

属性检查器显示导航控制器的表示选项

其他回答

如果你有一些业务逻辑,比如所有字段都应该在驳回之前被填充,你应该:

在ViewDidLoad上,如果你的ViewController已经在导航控制器中显示:

func viewDidLoad() { 
    self.navigationController?.presentationController?.delegate = self
}

如果没有,就简单地使用

func viewDidLoad() { 
    self.presentationController?.delegate = self
}

然后实现delegate方法:

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
    }

}

苹果在这个链接上分享了一个关于它的示例代码

它使用isModalInPresentation作为许多用户的建议。

所有的解决方案都很好,但在我的情况下,我需要一个停止移动的选项。 这是一个代码。

如果你想阻止移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = false

如果你想解锁移动:

self.yourViewController?.presentedView?.gestureRecognizers?[0].isEnabled = true

如果你正在使用故事板来布局你的UI,我发现在使用导航控制器时禁用这种交互式撤销的最好方法是将导航控制器在属性检查器中的表示从自动更改为全屏。导航堆栈中的所有视图控制器都将是全屏的,用户无法将其解散。

属性检查器显示导航控制器的表示选项

属性isModalInPresentation可能会有所帮助。

从文档中可以看到:

当你将它设置为true时,UIKit会忽略视图控制器边界之外的事件,并防止视图控制器在屏幕上时被交互式丢弃。

你可以这样使用它:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)