In iOS 7 hat Apple ein neues Standardnavigationsverhalten hinzugefügt. Sie können vom linken Bildschirmrand wischen, um zum Navigationsstapel zurückzukehren. In meiner App widerspricht dieses Verhalten jedoch meinem benutzerdefinierten linken Menü. Ist es also möglich, diese neue Geste in UINavigationController zu deaktivieren?
326
navigationItem.hidesBackButton = true
diese Geste auch deaktiviert wird, wenn Sie sie einstellen . In meinem Fall habe ich einen benutzerdefinierten Zurück-Button implementiert und alsleftBarButtonItem
Antworten:
Ich habe eine Lösung gefunden:
Ziel c:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
quelle
enable / disable
aufviewDidAppear:
/ erkennenviewDidDisappear
. Sie können dasUIGestureRecognizerDelegate
Protokoll auch mit Ihrer komplexeren Logik implementieren und alsrecognizer.delegate
Eigenschaft festlegen .self.navigationController.interactivePopGestureRecognizer.enabled
Eigenschaft funktioniert nicht nach Ansicht der Methoden in der folgenden:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, funktioniert aber in der MethodeviewWillDisappear
. Unter iOS7 funktioniert es mit allen oben genannten Methoden. Versuchen Sie also, es in anderen Methoden zu verwenden, während Sie am viewController arbeiten. Ich bestätige, dass es unter iOS8 für mich funktioniert, wenn ich auf eine Schaltfläche in der Ansicht klicke.Ich habe herausgefunden, dass es nicht immer funktioniert, die Geste auf deaktiviert zu setzen. Es funktioniert, aber für mich erst, nachdem ich die Backgesture einmal benutzt habe. Zum zweiten Mal würde es die Backgesture nicht auslösen.
Fix für mich war, die Geste zu delegieren und die Shouldbegin-Methode zu implementieren, um NO zurückzugeben:
quelle
viewWillAppear
in der Ansicht hinter der aktuellen Ansicht aufgerufen. Dies kann zu Chaos in der Codelogik führen, da die aktuelle Ansicht noch aktiv ist. Könnte die Ursache für Ihren Absturz sein.enabled
Ja / Nein-Zeilen benötigt? Sie kehrenNO
ausgestureRecognizerShouldBegin
, ist das nicht ausreichend?Entfernen Sie einfach die Gestenerkennung aus NavigationController. Arbeiten Sie in iOS 8.
quelle
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
irgendwo.Ab iOS 8 funktioniert die akzeptierte Antwort nicht mehr. Ich musste das Wischen stoppen, um die Geste auf meinem Hauptspielbildschirm zu verwerfen.
quelle
Ich habe Twans Antwort ein wenig verfeinert, weil:
nil
führt zu Problemen beim Aufhängen, wenn Sie zum Root-View-Controller zurückkehren und eine Wischgeste ausführen, bevor Sie an eine andere Stelle navigieren.Das folgende Beispiel setzt iOS 7 voraus:
quelle
Bitte setzen Sie dies in root vc:
quelle
Für Swift:
quelle
es funktioniert für mich in ios 10 und höher:
Bei der viewDidLoad () -Methode funktioniert dies nicht.
quelle
BEARBEITEN
Wenn Sie die Swipe-Back-Funktion für bestimmte Navigationscontroller verwalten möchten, sollten Sie SwipeBack verwenden .
Damit können Sie einstellen
navigationController.swipeBackEnabled = NO
.Zum Beispiel:
Es kann über CocoaPods installiert werden .
Ich entschuldige mich für mangelnde Erklärung.
quelle
self.navigationController.swipeBackEnabled = NO
bin ich mir ziemlich sicher, dass dies nur Ihre deaktiviert Die Swipe-Back-Geste der Bibliothek, die des Systems bleibt jedoch aktiviert.Meine Methode. Ein Gestenerkenner, der sie alle beherrscht:
Wichtig: Setzen Sie den Delegaten nirgendwo im Navigationsstapel zurück:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
quelle
Dies ist der Weg auf Swift 3
funktioniert bei mir
quelle
Alle diese Lösungen manipulieren Apples Gestenerkennung auf eine Weise, die sie nicht empfehlen. Mir wurde gerade von einem Freund gesagt, dass es eine bessere Lösung gibt:
Dabei ist myPanGestureRecognizer der Gestenerkenner, mit dem Sie z. B. Ihr Menü anzeigen. Auf diese Weise wird Apples Gestenerkennung von ihnen nicht wieder eingeschaltet, wenn Sie einen neuen Navigationscontroller drücken, und Sie müssen sich nicht auf hackige Verzögerungen verlassen, die möglicherweise zu früh ausgelöst werden, wenn Ihr Telefon in den Ruhezustand versetzt oder stark belastet wird.
Lassen Sie dies hier, weil ich weiß, dass ich mich beim nächsten Mal nicht mehr daran erinnern werde, und dann habe ich hier die Lösung für das Problem.
quelle
swift 5, swift 4.2 kann den folgenden Code verwenden.
quelle
Keine der gegebenen Antworten half mir, das Problem zu lösen. Poste meine Antwort hier; kann für jemanden hilfreich sein
Deklarieren Sie
private var popGesture: UIGestureRecognizer?
in Ihrem Viewcontroller als globale Variable. Implementieren Sie dann den Code in den Methoden viewDidAppear und viewWillDisappearDadurch wird das Zurückwischen ab iOS v8.x deaktiviert
quelle
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. In der nächsten Zeile wird popGesture auf einen Erkenner oder auf Null gesetzt. Verwenden Sie dann den Wert :if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Dies funktioniert unter
viewDidLoad:
iOS 8:Viele der Probleme konnten mit Hilfe des guten alten gelöst werden
dispatch_after
.Bitte beachten Sie, dass diese Lösung möglicherweise unsicher ist. Verwenden Sie jedoch Ihre eigenen Überlegungen.
Aktualisieren
Für iOS 8.1 sollte die Verzögerungszeit 0,5 Sekunden betragen
Unter iOS 9.3 ist keine Verzögerung mehr erforderlich. Sie können dies einfach in Folgendes einfügen
viewDidLoad
:(TBD, wenn unter iOS 9.0-9.3 funktioniert)
quelle
viewDidLoad
Plus Verzögerung ist eine riskante Programmierpraxis. Eine schlechte Angewohnheit zu beginnen. Was passiert, wenn der Benutzer den Wischvorgang startet, bevor Ihr verspäteter Anruf beginnt? Es gibt keine sichere Zeit, die garantiert lang genug und doch nicht zu lang ist. Aus diesem Grund schlagen andere Antworten, die lange vor Ihren veröffentlicht wurden, vor, den Code einzufügenviewDidAppear
. Das stellt sicher, dass alles installiert ist. Erfinde keine willkürlichen Verzögerungen. Verwenden Sie die beabsichtigte Anruffolge von Apple.Für Swift 4 funktioniert dies:
quelle
Bei den meisten Viewcontrollern hat es bei mir funktioniert.
Bei einigen Viewcontrollern wie UIPageViewController funktionierte dies nicht. Auf der Seite von UIPageViewController funktionierte der Codecontentviewcontroller unten für mich.
In UIGestureRecognizerDelegate
quelle