2013-09-22 10 views
15

Mam kontroler nawigacyjny w mojej aplikacji na system iOS 7. Widoczny jest tytuł titleView, a także przycisk Wstecz i pasek nawigacyjny. Z jakiegoś powodu interaktywny ruch popu (przesuwanie od lewej krawędzi) nie działa. Nic się nie dzieje. Kiedy loguję gest, nie jest on zerowy. Czy jest coś specjalnego, co muszę zrobić, aby włączyć tę funkcjonalność? Co może spowodować, że nie zadziała?UINavigationController Interaktywny gest pop nie działa?

Odpowiedz

25

Ech, wygląda po prostu musiałem ustawić delegata gest i wdrożyć następujące:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return YES; 

} 
+0

Ive sprawdził to jednak bardzo nieprzyjemnie problemów, kiedy mam to naprawić wtedy, gdy użytkownik przesuwa się w połowie drogi i następnie wracam i widzę następny kontroler nałożony na poprzedni kontroler widoku. Widzę kontroler Poprzedni widok, a następny zachodzący na siebie jest przezroczysty jak przezroczyste szkło.Tak więc użytkownik jest zablokowany w tym stanie. Dowolny pomysł. To jest coś Wyświetl pojawiło się/pojawi się problem z obsługą. –

12

Możesz umieścić ten wiersz w viewDidLoad metody.

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 
+0

pracował dla mnie .. Dzięki – Simmy

15

Spójrz na to response i komentarze. Wszystko co musisz zrobić, to ustawić delegata kontrolera nawigacyjnego interaktywnego pop gest Rozpoznawania do nil:

self.navigationController.interactivePopGestureRecognizer.delegate = nil; 

Ustawianie go do lanego siebie do id<UIGestureRecognizerDelegate> działa również dlatego, że wszystkie metody w protokole są opcjonalne, ale myślę, że ustawienie delegata do nil jest bardziej odpowiednie w tym przypadku.

+1

osiągnąłem sukces tylko wtedy, gdy w viewDidAppear – jonbauer

+6

To "działa", ale wkrótce potem powoduje bardzo dziwne problemy do momentu zamrożenia aplikacji (testowane z iOS 8, urządzenie) – Ixx

5

Im bardziej wypracowane odpowiedź była zarówno Aaron i lojals

Pierwszy dostosować kontroler nawigacyjny, a następnie umieścić ten kod w klasie

W viewDidLoad umieścić ten wiersz:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 

aw klasa Napisz tę funkcję

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;} 
18

Znalazłem th w przypadku używania niestandardowych przycisków wstecz, interaktywny gest pop przestaje działać (moim zdaniem Apple nie może przewidzieć, jak zachowa się Twój niestandardowy przycisk powrotu, więc wyłącza ten gest).

Aby rozwiązać ten problem, jak już wspomniano wcześniej, można ustawić właściwość interactivePopGestureRecognizer.delegate na nil.

w Swift, można to łatwo zrobić w całej swojej aplikacji, dodając rozszerzenie dla UINavigationController jak ten:

extension UINavigationController { 

    override public func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = nil 
    } 

} 

Updated odpowiedź

Wygląda ustawiania delegata do nil przyczyn interfejs aplikacji do zablokowania w niektórych scenariuszach (np. kiedy użytkownik przesuwa się w lewo lub w prawo na kontroler widoku z góry stosu nawigacji).

Ponieważ gestureRecognizerShouldBegin metoda delegat nie może być obsługiwane w rozszerzeniu, instacji UINavigationController wydaje się najlepszym rozwiązaniem:

class NavigationController: UINavigationController, UIGestureRecognizerDelegate { 

    /// Custom back buttons disable the interactive pop animation 
    /// To enable it back we set the recognizer to `self` 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = self 
    } 

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     return viewControllers.count > 1 
    } 

} 
+3

To wydaje się działać, ale okazuje się, że w pewnych okolicznościach zamraża aplikację. Wydaje mi się, że dzieje się tak, gdy pojawia się interaktywny ruch popu, gdy kontroler widoku jest naciskany. Bezpieczniejszym sposobem byłoby podklasy 'UINavigationController'. W podklasie ustaw dla siebie atrybut 'interactivePopGestureRecognizer.delegate' i zapobiegaj rozpoznawaniu interaktywnego gestu pop podczas przesyłania nowego kontrolera widoku. – joern

+0

Rzeczywiście, stwierdziłem, że ten problem również wydaje się mieć wpływ tylko na kontroler widoku z góry stosu kontrolera nawigacyjnego. Zaktualizowałem swoją odpowiedź za pomocą innego rozwiązania opartego na podklasach. –

+0

@Eneko Alonso perfect! Tak jak powiedziałeś, jeśli użytkownik przesuwa palcem w lewo lub w prawo, a następnie naciska przycisk - kontroler widoku push jest zgięty. Podklasowanie rozwiązuje problem 100% – Alex