web-dev-qa-db-fra.com

UINavigationController Interactive Pop Gesture ne fonctionne pas?

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?

20
Aaron Wojnowski

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;

}
25
Aaron Wojnowski

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
    }

}
38
Eneko Alonso

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.

18
cromandini

Vous pouvez mettre cette ligne dans la méthode viewDidLoad .

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

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;}
5
Vicky Dhas

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)
}
1
Doca

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
}
0
user4838524

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

  1. Créer un contrôleur de navigation
// I created a global variable, however not necessarily you will be doing this way
var nvc: UINavigationController!
  1. implémenter UIGestureRecognizerDelegate
class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {
  1. Instantiat UINavigationController dans la fonction didFinishLaunchingWithOptions de l'application
nvc=UINavigationController()

// For interactive pop gesture
nvc.navigationBar.isHidden=true
nvc?.interactivePopGestureRecognizer?.delegate=self
  1. Étape supplémentaire, ajout du contrôleur au contrôleur de navigation dans la fonction didFinishLaunchingWithOptions de l’application
window=UIWindow()
window?.rootViewController=nvc
window?.makeKeyAndVisible()

// BaseViewController is sample controller i created with xib
nvc.pushViewController(BaseViewController(), animated: true)
  1. Implémentez gusture Recognizer, ajoutez le code ci-dessous à AppDelegate.Swift
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
0
Rakesh Yembaram