2013-09-22 13 views
15

Also ich habe einen Navigationscontroller in meiner für iOS 7 gebauten App. Die Titelansicht ist sichtbar, ebenso wie die Zurück-Schaltfläche und die Navigationsleiste. Aus irgendeinem Grund funktioniert die interaktive Pop-Geste (Streichen von der linken Kante) nicht. Nichts passiert. Wenn ich die Geste protokolliere, ist es nicht null. Gibt es etwas Besonderes, um diese Funktionalität zu aktivieren? Was könnte dazu führen, dass es nicht funktioniert?UINavigationController Interaktive Pop-Geste funktioniert nicht?

Antwort

25

Eh, sieht aus wie ich nur die Geste Delegierten setzen musste und implementieren die folgenden:

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

    return YES; 

} 
+0

Ive dies überprüft, aber sehr gruselig Problem, wenn ich dieses Problem behoben haben, dann, wenn der Benutzer auf halbem Weg gleitet und Dann komm zurück, ich sehe den nächsten Controller überlagert auf dem vorherigen View-Controller. Ich sehe den Previous View Controller und der nächste Overlapped ist transparent wie transparentes Glas.Also ist der Benutzer zufällig diesen Zustand gesperrt. Irgendeine Idee. Dies ist etwas, das View erschienen ist/erscheint, wenn es um das Problem geht. –

12

Sie diese Zeile in der Methode viewDidLoad setzen können.

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

arbeitete für mich .. Danke – Simmy

15

Schauen Sie sich response und Kommentare.

self.navigationController.interactivePopGestureRecognizer.delegate = nil; 

Einstellung auf einem gegossenen Selbst id<UIGestureRecognizerDelegate> funktioniert auch, weil alle Methoden im Protokoll sind optional, aber ich denke, die Einstellung der Delegierten: Alles, was Sie tun müssen, ist Ihr Navigationscontroller interaktive Pop Gestenerkenner Delegierter zu nil gesetzt nil ist in diesem Fall besser geeignet.

+1

ich hatte nur Erfolg mit diesem wenn in ViewDidAppear – jonbauer

+6

Dieses "funktioniert" aber kurz danach verursacht sehr seltsame Probleme bis zum Einfrieren der App (getestet mit iOS 8, Gerät) – Ixx

5

Je mehr ausgearbeitet Antwort war beide Aaron und lojals

Erste Anpassen der Controller Navigation und dann diesen Code setzen in der Klasse

In viewDidLoad setzen Sie diese Zeile:

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

Und in Klasse schreibe diese Funktion

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

Ich habe th gefunden Wenn die benutzerdefinierten Zurück-Schaltflächen verwendet werden, funktioniert die interaktive Pop-Geste nicht mehr (ich nehme an, dass Apple nicht vorhersehen kann, wie sich die benutzerdefinierte Zurück-Schaltfläche verhalten wird, sodass sie die Geste deaktivieren).

Um dies wie bereits erwähnt zu beheben, können Sie die Eigenschaft interactivePopGestureRecognizer.delegate auf setzen.

extension UINavigationController { 

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

} 

aktualisiert Antwort

Scheint, wie die Einstellung der Delegierten nil Ursachen:

In Swift, kann dies durch Hinzufügen einer Erweiterung für UINavigationController wie diese leicht in Ihrer gesamten Anwendung erfolgen Die App-Benutzeroberfläche wird in einigen Szenarien eingefroren (z. B. wenn der Benutzer auf dem TopView-Controller des Navigationsstapels nach links oder rechts wischt).

Da gestureRecognizerShouldBegin Delegatmethode kann nicht in einer Erweiterung behandelt werden, Subklassen UINavigationController wie die beste Lösung scheint:

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

Dies scheint zu funktionieren, aber es stellt sich heraus, dass es unter bestimmten Umständen die App einfriert. Ich denke, es passiert, wenn die interaktive Pop-Geste ausgelöst wird, während ein View-Controller gedrückt wird. Ein sicherer Weg wäre die Unterklasse 'UINavigationController'. Setzen Sie in der Unterklasse den 'interactivePopGestureRecognizer.delegate' auf self und verhindern Sie, dass die interaktive Pop-Geste erkannt wird, während ein neuer View-Controller gedrückt wird. – joern

+0

In der Tat, ich habe festgestellt, dass dieses Problem auch nur die Top-View-Controller des Navigations-Controller-Stack betrifft. Ich habe meine Antwort mit einer anderen auf Unterklassen basierenden Lösung aktualisiert. –

+0

@Eneko Alonso perfekt! Wie Sie gesagt haben, wenn der Benutzer nach links oder rechts wischt und dann auf einen Knopf tippt, wird der Push-View-Controller gestört. Subclassing behebt das Problem 100% – Alex