Отключить интерактивное отключение представленного контроллера представления в iOS 13

iOS 13 представляет новый дизайн modalPresentationStyle .pageSheet (и его родственника .formSheet) для модально представленных контроллеров представления…

The new sliding modal presentation in iOS 13

… И мы можем отклонить эти листы, сдвинув представленный контроллер представления вниз (интерактивное отклонение). Хотя новая функция "тянуть-уволить" довольно полезна, она не всегда может быть желательной.

ВОПРОС: Как мы можем отключить интерактивное увольнение? - Помните, что мы придерживаемся стиля презентации.

Ответ 1

Вариант 1:

viewController.isModalInPresentation = true

Disabled interactive dismissal

(Отключенное интерактивное увольнение .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

  1. Если вы хотите использовать то же поведение, что и в предыдущей версии iOS (& lt; iOS13), как представление модели в полноэкранном режиме, просто установите стиль представления вашего конечного контроллера представления на UIModalPresentationStyle.fullScreen

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

    А если вы используете раскадровку, просто выберите segua и выберите Full Screen из выпадающего списка Presentation.

    enter image description here

  2. Если вы просто хотите отключить интерактивное отклонение и сохранить новый стиль представления, установите для свойства UIViewController isModalInPresentation значение true.

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

Ответ 3

Может помочь свойство isModalInPresentation.

Из документации:

Когда вы устанавливаете его в true, UIKit игнорирует события вне границ контроллера представления и предотвращает интерактивное отключение контроллера представления, пока он находится на экране.

Вы можете использовать это так:

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

Ответ 4

Если вы используете раскадровки для макета вашего пользовательского интерфейса, я нашел лучший способ отключить это интерактивное отклонение при использовании контроллера навигации - это изменить представление контроллера навигации в инспекторе атрибутов с автоматического на полноэкранный режим. Все контроллеры представления в вашем стеке навигации будут в полноэкранном режиме и не смогут быть отключены пользователем.

Инспектор атрибутов, показывающий опцию представления для контроллера навигации