J'ai donc un contrôleur de navigation dans mon application intégrée pour iOS 7. TitleView est visible, ainsi que le bouton Précédent et la barre de navigation. Pour une raison quelconque, le geste de pop interactif (glissement depuis le bord gauche) ne fonctionne pas. Rien ne se passe. Quand je me connecte le geste, ce n'est pas nul. Dois-je faire quelque chose de spécial pour activer cette fonctionnalité? Qu'est-ce qui pourrait le faire ne pas fonctionner?
Eh, on dirait que je viens de définir le délégué aux gestes et de mettre en œuvre ce qui suit:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
J'ai constaté que, lorsque vous utilisez les boutons arrière personnalisés, le geste interactif cesse de fonctionner (ma position est qu'Apple ne peut pas prévoir le comportement de votre bouton arrière personnalisé, de sorte qu'ils désactivent le geste).
Pour résoudre ce problème, comme mentionné précédemment, vous pouvez définir la propriété interactivePopGestureRecognizer.delegate
sur nil
.
En rapide, ceci peut être facilement fait dans toute votre application en ajoutant une extension pour :UINavigationController
comme ceci
extension UINavigationController {
override public func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = nil
}
}
Réponse mise à jour
On dirait que définir le délégué sur nil
provoque le blocage de l'interface utilisateur de l'application dans certains scénarios (par exemple, lorsque l'utilisateur balaie à gauche ou à droite sur le contrôleur de la vue supérieure de la pile de navigation).
Étant donné que la méthode de délégué gestureRecognizerShouldBegin
ne peut pas être gérée dans une extension, le sous-classement UINavigationController
semble être la meilleure solution:
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
}
}
Regardez cette réponse et commentaires. Tout ce que vous avez à faire est de définir le délégué du programme de reconnaissance de gestes interactifs de votre contrôleur de navigation sur nil
:
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
Le paramétrer sur id<UIGestureRecognizerDelegate>
de manière autonome fonctionne également, car toutes les méthodes du protocole sont optionnelles, mais je pense que définir le délégué sur nil
est plus approprié dans ce cas.
Vous pouvez mettre cette ligne dans la méthode viewDidLoad .
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
La réponse la plus élaborée était Aaron et les lojals
Commencez par personnaliser le contrôleur de navigation, puis mettez ce code dans la classe.
Dans ViewDidload, mettez cette ligne:
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
Et en classe écrivez cette fonction
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;}
Peut-être que quelqu'un trouvera cela utile.
Si vous souhaitez masquer la barre de navigation mais que vous utilisez des gestes de balayage normaux pour revenir en arrière et d'autres fonctions du contrôleur de navigation, vous devez utiliser: ( - barre de navigation )
self.navigationController?.navigationBar.isHidden = true
Si vous souhaitez désactiver la barre de navigation (masquer la barre de navigation, désactiver le balayage pour le retour), mais que vous souhaitez pousser le contrôleur de vue, vous devez utiliser: ( isNavigationBarHidden )
self.navigationController?.isNavigationBarHidden = true
Mise à jour du 7 décembre 2018:
Si votre premier contrôleur utilise la barre de navigation masquée, mais que les enfants suivants utilisent la barre de navigation, lorsque vous revenez au contrôleur de vue de base, une barre noire apparaît en transition à la place de la barre de navigation. Cela sera corrigé très facilement si vous utilisez le premier contrôleur de vue (père):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: animated)
}
Dans Swift 4, j'ai un UITableView dans mon contrôleur de vue, j'ai résolu ce problème avec:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.interactivePopGestureRecognizer?.delegate=nil
}
Ajoutez de manière générique un geste pop interactif à l'ensemble de l'application.
XCODE: 9.0, Swift : 4.0
Créez de préférence UINavigationController dans AppDelegate.Swift
// I created a global variable, however not necessarily you will be doing this way
var nvc: UINavigationController!
UIGestureRecognizerDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
UINavigationController
dans la fonction didFinishLaunchingWithOptions de l'applicationnvc=UINavigationController()
// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()
// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
Note: Voir l’autre billet de cette section pour connaître la différence entre
self.navigationController?.navigationBar.isHidden=true
Et
self.navigationController?.isNavigationBarHidden = true