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

Jak*_*lář 49 uiviewcontroller uikit modalviewcontroller ios ios13

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

iOS 13中的新滑动模态演示

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

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

Jak*_*lář 95

选项1:

viewController.isModalInPresentation = true
Run Code Online (Sandbox Code Playgroud)

残疾人互动解雇

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

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

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


选项2:

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

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

  • Objective-C:`viewController.modalInPresentation = YES;` (4认同)
  • 当“presentationControllerShouldDismiss(_presentationController: UIPresentationController)”返回 false 时,会调用“presentationControllerDidAttemptToDismiss(_presentationController: UIPresentationController)”,这样您就可以执行诸如在用户输入数据时添加确认对话框之类的操作。 (4认同)
  • 在“UIImagePickerController”上设置此标志时,有人让它起作用吗?对于我们来说,“UIImagePickerController”似乎忽略了它,因此可以通过滑动手势将其关闭。也许这是 iOS 13 的一个错误。 (3认同)
  • 如果提供的视图控制器是导航控制器,则可以在导航控制器上或导航堆栈中显示的各个视图控制器上设置`isModalInPresentation`。后者允许您逐个屏幕地选择是否可以进行交互式解雇。小心搜索控制器,它们优先于单个视图控制器(而不是导航控制器)。我的博客文章中的更多信息:https://medium.com/@hacknicity/view-controller-presentation-changes-in-ios-13-ac8c901ebc4e (2认同)
  • 请记住,如果您的 VC 显示为弹出窗口,这将防止在点击外部时弹出弹出窗口被关闭 (2认同)

Bil*_*lal 33

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

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen
    
    Run Code Online (Sandbox Code Playgroud)

    如果你使用的是故事板只需选择segua并选择Full Screen形成Presentation下拉。

    在此处输入图片说明

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

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 它比使用 {controller.isModalInPresentation = true } 效果更好。 (2认同)

rae*_*aed 10

如果您有一些业务逻辑,例如在关闭之前应填写所有字段之类的内容,您应该:

如果ViewDidLoad您的 ViewController 已出现在导航控制器中:

func viewDidLoad() { 
    self.navigationController?.presentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)

如果没有,只需使用

func viewDidLoad() { 
    self.presentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)

然后实现委托方法:

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
    }

}
Run Code Online (Sandbox Code Playgroud)


Moh*_*mar 8

该物业isModalInPresentation可能会有所帮助。

从文档:

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

你可以这样使用它:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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