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...
...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.
6 answers
Wariant 1:
viewController.isModalInPresentation = true
(Disabled interactive .pageSheet
)
- od iOS 13,
UIViewController
zawiera nową właściwość o nazwieisModalInPresentation
, która musi być ustawiona natrue
, 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 nazwiepresentationControllerShouldDismiss
. - metoda ta jest wywoływana tylko wtedy, gdy prezentowany kontroler widoku nie jest programowo odrzucany, a jego
isModalInPresentation
właściwość jest ustawiona nafalse
.
Wskazówka: nie zapomnij przypisać delegata presentationController.
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
-
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 rozwijanejPresentation
. -
Jeśli chcesz tylko wyłączyć funkcję interaktywną i zachować nowy zestaw stylów prezentacji
UIViewController
właściwośćisModalInPresentation
dotrue
.if #available(iOS 13.0, *) { someViewController.isModalInPresentation = true // available in IOS13 }
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)
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
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.
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
})
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