web-dev-qa-db-fra.com

UINavigationContoller interactivePopGestureRecognizer inactif lorsque la barre de navigation est masquée

J'ai un contrôleur de vue qui est imbriqué dans une UINavigationController.

J'ai implémenté iOS 7 interactivePopGestureRecognizer pour permettre à l'utilisateur de faire un geste pour extraire un VC de la pile.

Dans le VC, j'ai une vue à défilement et, bien que l'utilisateur ne se trouve pas en haut de la vue, je masque tout le chrome (barre de navigation et barre d'état) pour placer le focus sur le contenu.

Toutefois, avec la barre de navigation masquée, le composant interactifPopGestureRecognizer ne fonctionne pas.

J'ai essayé de l'activer après sa disparition et de vérifier que ce n'est pas nul, mais cela ne fonctionne toujours pas.

Y a-t-il quelque chose qui me manque?

18
Dan

Définissez votre sous-classe UIViewController en tant que délégué de gestureRecognizer:

self.navigationController.interactivePopGestureRecognizer.delegate = self;

C'est tout!

37
simonmaddox

Solution simple

Il suffit de définir la propriété masquée de la barre de navigation non par le biais du contrôleur de navigation.

Il suffit d'utiliser ces deux lignes

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;
16
Nagaraj

J'ai utilisé ça. self.navigationController.interactivePopGestureRecognizer.delegate = self;

également dans ma classe UINavigationController pour désactiver interactivePopGestureRecognizer pendant les transitions.

- (void)pushViewController:(UIViewController *)viewController
              animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.interactivePopGestureRecognizer.enabled = NO;
}

    [super pushViewController:viewController animated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated
{
    if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        // disable interactivePopGestureRecognizer in the rootViewController of navigationController
        if ([[navigationController.viewControllers firstObject] isEqual:viewController]) {
            navigationController.interactivePopGestureRecognizer.enabled = NO;
        } else {
            // enable interactivePopGestureRecognizer
            navigationController.interactivePopGestureRecognizer.enabled = YES;
        }
    }
}

la raison de la désactivation de interactivePopGestureRecognizer dans rootViewController est la suivante: lorsque vous faites glisser votre doigt sur Edge dans rootViewController, puis appuyez sur quelque chose pour insérer le suivant viewController, l'interface utilisateur n'accepte aucune touche pour l'instant. Appuyez sur le bouton d'accueil pour mettre l'application en arrière-plan, puis appuyez dessus pour entrer. premier plan...

7
hellkernel

Cela ne semble pas fonctionner pour moi. J'ai suivi le blog de Keithl. Cela n'a pas fonctionné non plus.

J'ai finalement réglé avec UISwipeGestureRecognizer. Il semble faire ce qu'il dit.

UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)];
[gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.navigationController.view addGestureRecognizer:gestureRecognizer];
3
ThefunkyCoder

L'ajout de ces deux lignes à -(void)viewDidAppear:(BOOL)animated a fonctionné pour moi.

self.navigationController.navigationBarHidden = NO;
self.navigationController.navigationBar.hidden = YES;

Et n'oubliez pas d'appeler <UIGestureRecognizerDelegate> dans le fichier .h.

0
Vaibhav Saran