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
Eh, sieht aus wie ich nur die Geste Delegierten setzen musste und implementieren die folgenden:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
Sie diese Zeile in der Methode viewDidLoad setzen können.
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
arbeitete für mich .. Danke – Simmy
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.
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;}
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 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).UINavigationController
wie diese
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
}
}
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
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. –
@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
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. –