禁用iOS 13中呈现的视图控制器的交互式解雇


135

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

iOS 13中的新滑动模态演示

…我们可以通过向下滑动显示的视图控制器来消除这些页面(交互式消除。尽管新的“拉动关闭”功能非常有用,但可能并不总是令人满意。

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



6
@MehulThakkar这是一个不同的问题。
雅各布·特鲁拉斯(JakubTruhlář)

Answers:


240

选项1:

viewController.isModalInPresentation = true

残疾人互动解雇

(禁用的交互式.pageSheet解雇行为是这样的。)

  • 由于iOS 13 UIViewController包含一个名为的新属性isModalInPresentation,必须设置该属性true以防止交互式解雇。
  • 它基本上会忽略视图控制器范围之外的事件。如果您不仅在使用自动样式,还在使用演示样式,例如,请记住这一点。.popover
  • false默认情况下,此属性。

来自官方文档:如果为true,则UIKit会忽略视图控制器范围之外的事件,并防止在屏幕上交互关闭视图控制器。


选项2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • 从iOS 13开始,UIAdaptivePresentationControllerDelegate包含了一个称为presentationControllerShouldDismiss
  • 仅当未以编程方式关闭提供的视图控制器且其isModalInPresentation属性设置为时,才调用此方法false

提示:不要忘记分配presentationController的委托。


2
如果提供的视图控制器是导航控制器,则可以isModalInPresentation在导航控制器上设置,也可以在导航堆栈中显示的各个视图控制器上设置。后者允许您逐个屏幕地选择是否可以进行交互式解雇。小心搜索控制器,它们优先于单个视图控制器(而不是导航控制器)。我的博客文章中的更多信息: medium.com/@hacknicity/...
杰夫Hackworth

1
请记住,如果您的VC显示为弹出窗口,则可以防止在弹出窗口时轻按弹出窗口
PatrickDotStar

4
Objective-C:viewController.modalInPresentation = YES;
Quarac

3
将此标志设置为时,有人可以使用UIImagePickerController吗?对我们来说,它似乎UIImagePickerController忽略了它,因此可以通过滑动手势将其消除。也许是iOS 13的错误。
PatrickDotStar

4
presentationControllerShouldDismiss(_ presentationController: UIPresentationController)返回false时,将presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)被调用,因此,如果用户输入了数据,则可以执行添加确认对话框之类的操作。
尼尔

66
  1. 如果您希望获得与以前的iOS版本(<iOS13)相同的行为(例如全屏模型演示),只需将目标视图控制器的演示样式设置为 UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen

    如果您使用情节提要,请选择segua并选择 Full Screen形成Presentation下拉。

    在此处输入图片说明

  2. 如果您只想禁用交互式解雇并将新的演示文稿样式set UIViewController属性设置isModalInPresentationtrue

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }

它比使用{controller.isModalInPresentation = true}更好。
Maxim Firsoff

8

该属性isModalInPresentation可能会有所帮助。

从文档中:

当您将其设置true为时,UIKit会忽略视图控制器范围之外的事件,并防止视图控制器在屏幕上时被交互关闭。

您可以像这样使用它:

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

5

如果您使用情节提要板来布局UI,我发现在使用导航控制器时禁用此交互式解雇的最佳方法是将属性检查器中导航控制器的显示方式从“自动”更改为“全屏”。导航堆栈中的所有视图控制器将全屏显示,并且将无法被用户关闭。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.