Отключить интерактивное отключение представленного контроллера представления в iOS 13
iOS 13 представляет новый дизайн modalPresentationStyle
.pageSheet
(и его родственника .formSheet
) для модально представленных контроллеров представления…
… И мы можем отклонить эти листы, сдвинув представленный контроллер представления вниз (интерактивное отклонение). Хотя новая функция "тянуть-уволить" довольно полезна, она не всегда может быть желательной.
ВОПРОС: Как мы можем отключить интерактивное увольнение?
- Помните, что мы придерживаемся стиля презентации.
Ответы
Ответ 1
Вариант 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
Если вы хотите использовать то же поведение, что и в предыдущей версии iOS (& lt; iOS13), как представление модели в полноэкранном режиме, просто установите стиль представления вашего конечного контроллера представления на UIModalPresentationStyle.fullScreen
let someViewController = \*VIEW CONTROLLER*\
someViewController.modalPresentationStyle = .fullScreen
А если вы используете раскадровку, просто выберите segua и выберите Full Screen
из выпадающего списка Presentation
.
Если вы просто хотите отключить интерактивное отклонение и сохранить новый стиль представления, установите для свойства 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
Если вы используете раскадровки для макета вашего пользовательского интерфейса, я нашел лучший способ отключить это интерактивное отклонение при использовании контроллера навигации - это изменить представление контроллера навигации в инспекторе атрибутов с автоматического на полноэкранный режим. Все контроллеры представления в вашем стеке навигации будут в полноэкранном режиме и не смогут быть отключены пользователем.
Инспектор атрибутов, показывающий опцию представления для контроллера навигации