W iOS 7 Apple dodał nowe domyślne zachowanie nawigacyjne. Możesz przesunąć palcem od lewej krawędzi ekranu, aby wrócić do stosu nawigacji. Ale w mojej aplikacji takie zachowanie jest sprzeczne z moim niestandardowym lewym menu. Czy więc można wyłączyć ten nowy gest w UINavigationController?
326
navigationItem.hidesBackButton = true
, ten gest również zostanie wyłączony. W moim przypadku zaimplementowałem niestandardowy przycisk Wstecz i dodaję jakoleftBarButtonItem
Odpowiedzi:
Znalazłem rozwiązanie:
Cel C:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
źródło
enable / disable
rozpoznać naviewDidAppear:
/viewDidDisappear
. Lub możesz zaimplementowaćUIGestureRecognizerDelegate
protokół przy użyciu bardziej złożonej logiki i ustawić go jakorecognizer.delegate
właściwość.self.navigationController.interactivePopGestureRecognizer.enabled
właściwość nie działa w następujących metod widok na:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, ale prace w metodzieviewWillDisappear
. Na iOS7 działa we wszystkich wyżej wymienionych metodach. Więc spróbuj użyć go w innych metodach podczas pracy z viewController, potwierdzam, że działa dla mnie na iOS8, kiedy kliknę jakiś przycisk w widoku.Dowiedziałem się, że ustawienie wyłączonego gestu nie zawsze działa. To działa, ale dla mnie zadziałało dopiero po tym, jak raz użyłem backgesture. Za drugim razem nie spowodowałoby to opóźnienia.
Naprawiono dla mnie delegowanie gestu i zaimplementowanie metody shouldbegin w celu zwrócenia NIE:
źródło
viewWillAppear
jest wywoływany w widoku za bieżącym widokiem. Może to spowodować spustoszenie w logice kodu, ponieważ bieżący widok jest nadal aktywny. Może to być przyczyną twojego wypadku.enabled
potrzebne są wiersze tak / nie? WracaszNO
zgestureRecognizerShouldBegin
, czy to nie wystarczy?Wystarczy usunąć rozpoznawanie gestów z NavigationController. Pracuj w iOS 8.
źródło
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
gdzieś.Począwszy od iOS 8, zaakceptowana odpowiedź już nie działa. Musiałem zatrzymać przesuwanie, aby odrzucić gest na głównym ekranie gry, więc zaimplementowałem to:
źródło
Ulepszyłem nieco odpowiedź Twana, ponieważ:
nil
prowadzi do problemów z zawieszaniem się, gdy wrócisz do kontrolera widoku głównego i wykonasz gest machnięcia przed nawigacją w innym miejscu.Poniższy przykład zakłada iOS 7:
źródło
Proszę ustawić to w root vc:
źródło
Dla Swift:
źródło
działa dla mnie w iOS 10 i późniejszych:
nie działa na metodzie viewDidLoad ().
źródło
EDYTOWAĆ
Jeśli chcesz zarządzać funkcją przesunięcia wstecz dla określonych kontrolerów nawigacji, rozważ użycie SwipeBack .
Dzięki temu możesz ustawić
navigationController.swipeBackEnabled = NO
.Na przykład:
Można go zainstalować za pośrednictwem CocoaPods .
Przepraszam za brak wyjaśnień.
źródło
self.navigationController.swipeBackEnabled = NO
, jestem pewien, że spowoduje to wyłączenie twojego gest przesunięcia biblioteki do tyłu, ale systemowy nadal będzie włączony.Moja metoda Rozpoznawanie gestów, aby rządzić nimi wszystkimi:
Ważne: nie resetuj delegata w dowolnym miejscu stosu nawigacji:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
źródło
Tak działa Swift 3
pracuje dla mnie
źródło
Wszystkie te rozwiązania manipulują rozpoznawaniem gestów Apple w sposób, którego nie zalecają. Przyjaciel powiedział mi właśnie, że istnieje lepsze rozwiązanie:
gdzie myPanGestureRecognizer to rozpoznawanie gestów, którego używasz np. do wyświetlania menu. W ten sposób rozpoznawanie gestów Apple nie włącza się ponownie po naciśnięciu nowego kontrolera nawigacyjnego i nie trzeba polegać na hackujących opóźnieniach, które mogą zadziałać zbyt wcześnie, jeśli telefon zostanie uśpiony lub obciążony.
Zostawię to tutaj, ponieważ wiem, że nie zapamiętam tego następnym razem, gdy będę go potrzebować, a następnie znajdę rozwiązanie tego problemu tutaj.
źródło
swift 5, swift 4.2 może korzystać z kodu poniżej.
źródło
Żadna z podanych odpowiedzi nie pomogła mi rozwiązać problemu. Zamieszczam tutaj moją odpowiedź; może być komuś pomocny
Zadeklaruj
private var popGesture: UIGestureRecognizer?
jako zmienną globalną w kontroler widoku. Następnie zaimplementować kod w viewDidAppear i viewWillDisappear metodTo spowoduje wyłączenie machnięcia z powrotem w iOS v8.x roku
źródło
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. Następny wiersz ustawia popGesture na rozpoznawanie lub na zero. Następnie użyć tej wartości:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Działa to w
viewDidLoad:
systemie iOS 8:Wiele problemów można rozwiązać za pomocą dobrych starych
dispatch_after
.Chociaż należy pamiętać, że to rozwiązanie jest potencjalnie niebezpieczne, użyj własnego uzasadnienia.
Aktualizacja
W przypadku iOS 8.1 czas opóźnienia powinien wynosić 0,5 sekundy
W iOS 9.3 nie jest już potrzebne żadne opóźnienie, działa po prostu umieszczając to w
viewDidLoad
:(TBD, jeśli działa na iOS 9.0-9.3)
źródło
viewDidLoad
plus opóźnienie jest ryzykowną praktyką programistyczną. Zły nawyk na start. Co się stanie, jeśli użytkownik rozpocznie przeciąganie, zanim rozpocznie się opóźnione połączenie? Nie ma bezpiecznego czasu, który byłby wystarczająco długi, ale nie za długi. Dlatego inne odpowiedzi, opublikowane na długo przed twoimi, sugerują umieszczenie koduviewDidAppear
. To gwarantuje, że wszystko jest zainstalowane. Nie wymyślaj arbitralnych opóźnień; używaj sekwencji połączeń Apple zgodnie z przeznaczeniem.W przypadku Swift 4 działa to:
źródło
To działało dla mnie dla większości kontrolerów widoku.
Nie działało to w przypadku niektórych kontrolerów widoku, takich jak UIPageViewController. Na UIPageViewController pagecontentviewcontroller poniższy kod działał dla mnie.
Na UIGestureRecognizerDelegate,
źródło