Wyłączenie interaktywnego zwalniania prezentowanego kontrolera widoku

IOS 13 wprowadza nowy design modalPresentationStyle .pageSheet (i jego rodzeństwo .formSheet) dla modalnie prezentowanych kontrolerów widoku...

Nowa prezentacja modalna w systemie iOS 13

...i możemy odrzucić te arkusze przesuwając prezentowany kontroler widoku w dół (Interactive Disclosure) . Chociaż nowa funkcja "pull-to-disable" jest całkiem przydatna, nie zawsze może być pożądana.

Pytanie: [[5]] Jak wyłączyć interaktywne zwolnienie? - miej na uwadze utrzymujemy ten sam styl prezentacji.

Author: Jakub Truhlář, 2019-06-05

6 answers

Wariant 1:

viewController.isModalInPresentation = true

Interaktywne zwolnienie osób niepełnosprawnych

(Disabled interactive .pageSheet)

  • od iOS 13, UIViewController zawiera nową właściwość o nazwie isModalInPresentation, która musi być ustawiona na true, aby zapobiec interaktywnemu zwolnieniu.
  • zasadniczo ignoruje zdarzenia poza granicami kontrolera widoku. Pamiętaj o tym, jeśli używasz nie tylko stylu automatycznego, ale także stylów prezentacji, takich jak .popover itp.
  • ta właściwość is false domyślnie.

Z oficjalnych dokumentów: Jeśli true, UIKit ignoruje zdarzenia poza granicami kontrolera widoku i zapobiega interaktywnemu zwolnieniu kontrolera widoku, gdy jest on wyświetlany na ekranie.


Wariant 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • od iOS 13, UIAdaptivePresentationControllerDelegate zawiera nową metodę o nazwie presentationControllerShouldDismiss.
  • metoda ta jest wywoływana tylko wtedy, gdy prezentowany kontroler widoku nie jest programowo odrzucany, a jego isModalInPresentation właściwość jest ustawiona na false.

Wskazówka: nie zapomnij przypisać delegata presentationController.

 295
Author: Jakub Truhlář,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-17 02:55:25
  1. Jeśli chcesz zachować takie samo zachowanie jak w poprzedniej wersji iOS (UIModalPresentationStyle.fullScreen

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

    A jeśli używasz storyboard po prostu wybierz segua i wybierz Full Screen z listy rozwijanej Presentation.

    Tutaj wpisz opis obrazka

  2. Jeśli chcesz tylko wyłączyć funkcję interaktywną i zachować nowy zestaw stylów prezentacji UIViewController właściwość isModalInPresentation do true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
    
 73
Author: Bilal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-16 11:15:03

Nieruchomość isModalInPresentation może pomóc.

Z dokumentacji:

Po ustawieniu na true, UIKit ignoruje zdarzenia poza granicami kontrolera widoku i zapobiega interaktywnemu zwolnieniu kontrolera widoku, gdy jest on wyświetlany na ekranie.

Możesz go użyć tak:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
 8
Author: Mohit Tomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-25 15:03:06

Jeśli używasz storyboardów do układania interfejsu znalazłem najlepszy sposób, aby wyłączyć to interaktywne zwolnienie podczas korzystania z kontrolera nawigacji jest zmiana prezentacji kontrolera nawigacji w Inspektorze atrybutów z automatycznego Na Pełny ekran. Wszystkie kontrolery widoku w stosie nawigacji będą wtedy pełnoekranowe i nie będą mogły zostać odrzucone przez użytkownika.

Atrybut Inspector pokazujący opcję prezentacji dla kontrolera nawigacji

 5
Author: Brandon Whitton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-11 12:43:29

Apple udostępniło przykładowy kod na ten temat pod tym linkiem

Używa isModalInPresentation jak wielu użytkowników.

 1
Author: Arda Oğul Üçpınar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-11 12:22:09

Możesz teraz zaimplementować delegata dla rozpoznawania gestów interakcji i wyłączyć interakcję, jeśli istnieje próba jednoczesnej interakcji z suwakiem. W ten sposób zachowasz interaktywne odrzucenie, podczas gdy suwak działa zgodnie z oczekiwaniami.

Możesz wyłączyć przesunięcie w dół w następujący sposób:

let controller = storyboard?.instantiateViewController(withIdentifier: "NextVC") as! NextVC
let navigationController = UINavigationController(rootViewController: controller)
self.present(navigationController, animated: true, completion: {
   navigationController.presentationController?.presentedView?.gestureRecognizers?[0].isEnabled = false
})
 0
Author: Paresh Mangukiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-09 05:08:59