iosuiviewcontrolleruikitmodalviewcontrollerios13

Disable the interactive dismissal of presented view controller


iOS 13 introduces a new design of modalPresentationStyle .pageSheet (and its sibling .formSheet) for modally presented view controllers…

The new sliding modal presentation in iOS 13

…and we can dismiss these sheets by sliding the presented view controller down (interactive dismissal). Although the new "pull-to-dismiss" feature is pretty useful, it may not always be desirable.

THE QUESTION: How can we turn the interactive dismissal off? - Bear in mind we keep the presentation style the same.


Solution

  • Option 1:

    viewController.isModalInPresentation = true
    

    Disabled interactive dismissal

    (Disabled interactive .pageSheet dismissal acts like this.)

    From the official docs: If true, UIKit ignores events outside the view controller's bounds and prevents the interactive dismissal of the view controller while it is onscreen.


    Option 2:

    func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        return false
    }
    

    Tip: Don't forget to assign presentationController's delegate. But be aware, it is known that even just accessing the presentationController can cause a memory leak.