web-dev-qa-db-fra.com

Comment désactiver le geste automatique pour revenir en arrière avec une manette de navigation?

Je remarque donc que tous mes points de vue reçoivent le geste de revenir en arrière (afficher une vue) lorsque l'utilisateur fait glisser le curseur tout à gauche de l'écran (dans l'un ou l'autre sens) ( Ceci est nouveau avec iOS7 )

J'ai essayé jusqu'ici sans succès de l'éteindre en utilisant:

    [self.navigationItem setHidesBackButton:YES];

Dans l'init du NavigationController lui-même (comme le délégué semble l'utiliser).

22
Danoli3

obj-c

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

Rapide

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
72
Gabriele Petronella

Ajout à la solution de Gabriele.

Pour prendre en charge tout iOS avant iOS 7, vous devrez envelopper ce code avec ceci:

if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    }

Cela empêchera l'application de se bloquer dans iOS 6 et iOS 5 en raison d'un sélecteur manquant.

6
Danoli3

J'utilise cette solution dans mon projet, elle désactive uniquement interactivePopGestureRecognizer et vous permet d'utiliser un autre identificateur de mouvements.

- (void)viewDidLoad {

    [super viewDidLoad];

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;

    }

}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) {

        return NO;

    } else {

        return YES;

    }

}
5
Userich

J'ai découvert que régler le geste sur désactivé ne fonctionnait pas toujours. Cela fonctionne, mais pour moi, cela n'a fonctionné qu'après avoir utilisé le backgesture. Deuxième fois, cela ne déclencherait pas le backgesture.

Fix pour moi était de déléguer le geste et d'implémenter la méthode shouldbegin pour renvoyer NO:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    // Disable iOS 7 back gesture
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    // Enable iOS 7 back gesture
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return NO;
}
4
Antoine

Pour IOS 8 (Swift):

class MainNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.interactivePopGestureRecognizer.enabled = false

        // Do any additional setup after loading the view.
    }

}
3
ilan

Utilisez ce code pour les versions antérieures à iOS 7

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
0
Shardul