Dans iOS 7, Apple a ajouté un nouveau comportement de navigation par défaut. Vous pouvez balayer depuis le bord gauche de l'écran pour revenir sur la pile de navigation. Mais dans mon application, ce comportement est en conflit avec mon menu de gauche personnalisé. Alors, est-il possible de désactiver ce nouveau geste dans UINavigationController?
326
navigationItem.hidesBackButton = true
, ce geste est également désactivé. Dans mon cas, j'ai implémenté un bouton de retour personnalisé et l'ajout en tant queleftBarButtonItem
Réponses:
J'ai trouvé une solution:
Objectif c:
Swift 3+:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
la source
enable / disable
reconnaître surviewDidAppear:
/viewDidDisappear
. Ou, vous pouvez implémenter leUIGestureRecognizerDelegate
protocole avec votre logique plus complexe et le définir commerecognizer.delegate
propriété.self.navigationController.interactivePopGestureRecognizer.enabled
propriété ne fonctionne pas en suivant les méthodes de vue:viewDidLoad
,viewWillAppear
,viewDidAppear
,viewDidDisappear
, mais les travaux de méthodeviewWillDisappear
. Sur iOS7, il fonctionne dans toutes les méthodes mentionnées ci-dessus. Essayez donc de l'utiliser dans toutes les autres méthodes tout en travaillant sur le viewController, je confirme qu'il fonctionne pour moi sur iOS8 lorsque je clique sur un bouton à l'intérieur de la vue.J'ai découvert que le fait de désactiver le geste uniquement ne fonctionnait pas toujours. Cela fonctionne, mais pour moi, cela ne s'est produit qu'après avoir utilisé la backgesture. La deuxième fois, cela ne déclencherait pas la backgesture.
Le correctif pour moi était de déléguer le geste et d'implémenter la méthode shouldbegin pour retourner NO:
la source
viewWillAppear
est appelé sur la vue derrière la vue actuelle. Cela peut provoquer des ravages dans la logique du code car la vue actuelle est toujours active. Pourrait être la cause de votre crash.enabled
lignes oui / non sont-elles nécessaires? Vous revenezNO
degestureRecognizerShouldBegin
, n'est pas ce suffisant?Supprimez simplement la reconnaissance des gestes de NavigationController. Travaillez dans iOS 8.
la source
[self.navigationController.view addGestureRecognizer:self.navigationController.interactivePopGestureRecognizer]
quelque part.Depuis iOS 8, la réponse acceptée ne fonctionne plus. Je devais arrêter le balayage pour ignorer le geste sur mon écran de jeu principal, j'ai donc implémenté ceci:
la source
J'ai un peu raffiné la réponse de Twan, car:
nil
conduit à des problèmes de blocage lorsque vous revenez au contrôleur de vue racine et effectuez un geste de balayage avant de naviguer ailleurs.L'exemple suivant suppose iOS 7:
la source
Veuillez définir ceci dans root vc:
la source
Pour Swift:
la source
cela fonctionne pour moi dans ios 10 et versions ultérieures:
cela ne fonctionne pas sur la méthode viewDidLoad ().
la source
ÉDITER
Si vous souhaitez gérer la fonction de balayage arrière pour des contrôleurs de navigation spécifiques, pensez à utiliser SwipeBack .
Avec cela, vous pouvez définir
navigationController.swipeBackEnabled = NO
.Par exemple:
Il peut être installé via CocoaPods .
Je m'excuse par manque d'explication.
la source
self.navigationController.swipeBackEnabled = NO
je suis presque sûr que cela ne désactivera que votre le mouvement de balayage de la bibliothèque, mais celui du système sera toujours activé.Ma méthode. Un reconnaisseur de gestes pour les gouverner tous:
Important: ne réinitialisez le délégué nulle part dans la pile de navigation:
navigationController!.interactivePopGestureRecognizer!.delegate = nil
la source
C'est la voie sur Swift 3
travaille pour moi
la source
Toutes ces solutions manipulent le reconnaisseur de gestes d'Apple d'une manière qu'elles ne recommandent pas. Un ami vient de me dire qu'il existe une meilleure solution:
où myPanGestureRecognizer est le module de reconnaissance de gestes que vous utilisez pour, par exemple, afficher votre menu. De cette façon, le reconnaisseur de gestes d'Apple n'est pas réactivé par eux lorsque vous appuyez sur un nouveau contrôleur de navigation et vous n'avez pas besoin de compter sur des retards hackers qui peuvent se déclencher trop tôt si votre téléphone est mis en veille ou sous une lourde charge.
Laissant cela ici parce que je sais que je ne m'en souviendrai pas la prochaine fois que j'en aurai besoin, et alors j'aurai la solution au problème ici.
la source
swift 5, swift 4.2 peut utiliser le code ci-dessous.
la source
Aucune des réponses données ne m'a aidé à résoudre le problème. Publier ma réponse ici; peut être utile pour quelqu'un
Déclarez
private var popGesture: UIGestureRecognizer?
comme variable globale dans votre viewcontroller. Puis implémentez le code dans les méthodes viewDidAppear et viewWillDisappearCela désactivera le balayage dans iOS v8.x et suivants
la source
interactivePopGestureRecognizer.delegate
.if( .. respondsToSelector ..
. La ligne suivante définit popGesture sur un module de reconnaissance ou sur zéro. Ensuite , utilisez sa valeur:if (self.popGesture != nil) self.navigationController .. removeGestureRecognizer( self.popGesture )
.Cela fonctionne
viewDidLoad:
pour iOS 8:Beaucoup de problèmes pourraient être résolus avec l'aide du bon vieux
dispatch_after
.Bien que veuillez noter que cette solution est potentiellement dangereuse, veuillez utiliser votre propre raisonnement.
Mettre à jour
Pour iOS 8.1, le délai devrait être de 0,5 seconde
Sur iOS 9.3, aucun délai n'est plus nécessaire, cela fonctionne simplement en le plaçant dans votre
viewDidLoad
:(À déterminer si fonctionne sur iOS 9.0-9.3)
la source
viewDidLoad
plus le retard est une pratique de programmation risquée. Une mauvaise habitude pour commencer. Que se passe-t-il si l'utilisateur commence le balayage avant que votre appel retardé ne se déclenche? Il n'y a pas de temps sûr qui soit suffisamment long mais pas trop long. C'est pourquoi d'autres réponses, postées bien avant la vôtre, suggèrent d'insérer le codeviewDidAppear
. Cela garantit que tout est installé. N'inventez pas de retards arbitraires; utiliser la séquence d'appels d'Apple comme prévu.Pour Swift 4, cela fonctionne:
la source
Cela a fonctionné pour moi pour la plupart des contrôleurs de vue.
Cela ne fonctionnait pas pour certains viewcontrollers comme UIPageViewController. Sur pagecontentviewcontroller UIPageViewController ci-dessous, le code a fonctionné pour moi.
Sur UIGestureRecognizerDelegate,
la source