Вимкнути інтерактивне звільнення представленого контролера перегляду в iOS 13


135

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

Нова розсувна модальна презентація в iOS 13

… І ми можемо відхилити ці аркуші, просунувши представлений контролер подання вниз (інтерактивне звільнення) . Хоча нова функція "тягнути до звільнення" є досить корисною, вона не завжди може бути бажаною.

ПИТАННЯ: Як можна відключити інтерактивне звільнення? - Майте на увазі, ми зберігаємо стиль викладу однаковий.



6
@MehulThakkar Це вже інше питання.
Jakub Truhlář

Відповіді:


240

Варіант 1:

viewController.isModalInPresentation = true

Інтерактивне звільнення з обмеженими можливостями

(Інтерактивне .pageSheetзвільнення діє як таке).

  • Оскільки iOS 13 UIViewControllerмістить нову властивість, яку називають, isModalInPresentationяку необхідно встановити trueдля запобігання інтерактивного звільнення.
  • В основному він ігнорує події поза межами контролера перегляду. Майте це на увазі, якщо ви використовуєте не тільки автоматичний стиль, але й стилі презентації, наприклад .popoverтощо.
  • Ця властивість falseза замовчуванням.

З офіційних документів : Якщо trueUIKit ігнорує події поза межами контролера перегляду та запобігає інтерактивному звільненню контролера перегляду, поки він знаходиться на екрані.


Варіант 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Оскільки iOS 13, UIAdaptivePresentationControllerDelegateмістить новий метод під назвою presentationControllerShouldDismiss.
  • Цей метод викликається лише в тому випадку, якщо представлений контролер подання не відпускається програмно та встановлено його isModalInPresentationвластивість false.

Порада: не забудьте призначити представника представника представлення контролера.


2
Якщо представлений контролер подання є контролером навігації, ви можете встановити isModalInPresentationна навігаційному контролері або на окремих контролерах перегляду, показаних у навігаційному стеку. Останнє дозволяє вибирати на екрані за екраном, чи можливе інтерактивне звільнення. Обережно з контролерами пошуку вони мають перевагу над контролером окремого перегляду (але не над контролером навігації). Більше інформації в моєму блозі: medium.com/@hacknicity/…
Джефф Хакворт

1
Майте на увазі, що якщо ваш ВК буде представлений як переповнений, це не дозволить звільнити
попову

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. Якщо ви просто хочете , щоб відключити інтерактивне звільнення і зберегти новий стиль презентації набір UIViewControllerвластивість isModalInPresentationдо true.

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

Це працює краще, ніж використання {controller.isModalInPresentation = true}.
Максим Фірсофф

8

Майно isModalInPresentationможе допомогти.

З документації:

Коли ви встановите його на true, UIKit ігнорує події поза межами контролера перегляду та запобігає інтерактивному відключенню контролера перегляду, поки він знаходиться на екрані.

Ви можете використовувати його так:

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

5

Якщо ви використовуєте мовленнєві дошки для компонування свого інтерфейсу, я знайшов найкращий спосіб відключити це інтерактивне звільнення при використанні контролера навігації - змінити подання навігаційного контролера в інспекторі атрибутів з автоматичного на повний екран. Усі контролери перегляду у вашому стеку навігації будуть повноекранними і користувач не зможе їх відхилити.

Інспектор атрибутів показує параметр презентації для навігаційного контролера


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.