UINavigationContoller interactivePopGestureRecognizer inactivo cuando la barra de navegación está oculto

Tengo un controlador de vista de lo que está anidada dentro de una UINavigationController.

He implementado el iOS 7 interactivePopGestureRecognizer para permitir que el usuario gesto pop con una VC fuera de la pila.

Dentro de la VC tengo un scrollview y mientras el usuario no se encuentra en la parte superior de la scrollview puedo ocultar todo el cromo (barra de Navegación y la barra de estado) para centrarse en el contenido.

Sin embargo, con la barra de navegación oculta, la interactivePopGestureRecognizer no está funcionando.

He intentado habilitar después de que ha desaparecido y verificado no es nula, sin embargo aún así no funciona.

Hay algo que me estoy perdiendo?

InformationsquelleAutor Dan | 2013-11-07

5 Kommentare

  1. 37

    Conjunto de su UIViewController subclase como el gestureRecognizer delegado:

    self.navigationController.interactivePopGestureRecognizer.delegate = self;
    

    Que es!

    • Gracias, en realidad ajuste a nil también funciona. Me pregunto si esto es un bug?
    • No será un error si se establece el auto.navigationController.interactivePopGestureRecognizer.delegado a sí mismo o a nil: Deslice el dedo desde el borde de la pantalla y toque algo para empujar un controlador de vista en la navegación controlador rápidamente, entonces-1. La vista actual controlador no responde cualquier evento táctil; 2. La nueva vista contrller no se muestra; 3. Deslice el dedo desde el borde de la pantalla de nuevo, la nueva vista contrller se muestra; 4. Llame popViewControllerAnimated: con la animación del conjunto de parámetros a NO (toca la costumbre botón atrás), crash!
    • Parece que solo ajuste el delegado no es suficiente, ver el informe de accidente por @iwill. La solución que encontramos fue a la tienda el delegado original, por ejemplo, en viewDidLoad, establece como uno nuevo en viewDidAppear: y, a continuación, restablezca de nuevo a la original en viewDidDisappear:. Un poco extraño, pero funciona.
    • teniendo el mismo problema, pero he intentado la solución, no parece estar funcionando.
    • Yo no recomendaría esta solución. Esto resultó en varios errores al presentar/popping vista de los controladores.
    • Usted debe ponerlo en viewDidAppear -(void)viewDidAppear:(BOOL)animadas { self.navigationController.interactivePopGestureRecognizer.delegado = auto; }
    • Si desea utilizar más interactivePop en su pila de navegación usted tiene que guardar objeto delegado antes de cambiar interactivePopGestureRecognizer.delegate y restaurar el valor inicial cuando UIViewController desaparece.
    • ¿alguna vez ha de averiguar cómo hacer esto bien? Im tengan exactamente el mismo problema que usted ha mencionado/
    • ¿qué sugeriría usted para este entonces?
    • He publicado una respuesta stackoverflow.com/a/20672693/456536

  2. 16

    Solución Simple

    Acaba de establecer la propiedad oculto de la barra de navegación no a través de la navegación controlador de

    Sólo el uso de estas dos líneas de

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

    He utilizado este.
    self.navigationController.interactivePopGestureRecognizer.delegate = self;

    también en mi UINavigationController clase para deshabilitar interactivePopGestureRecognizer durante las transiciones.

    - (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 razón de deshabilitar interactivePopGestureRecognizer en rootViewController es:cuando pase el dedo desde el borde en rootViewController y, a continuación, toque algo para empujar en la siguiente viewController, la interfaz de usuario no acepta cualquier toca ahora.Pulse el botón inicio para poner la aplicación en segundo plano y , a continuación, presiona entrar en el primer plano…

  4. 3

    Esto no parece funcionar para mí. He seguido Keithl entrada en el blog. Tampoco el que trabajo.

    Yo finalmente se quedaron con UISwipeGestureRecognizer. Parece que hacer lo que dice.

    UISwipeGestureRecognizer *gestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(backButtonPressed:)];
    [gestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [self.navigationController.view addGestureRecognizer:gestureRecognizer];
    
    • Quiso decir el uso de UIEdgePanGestureRecognizer?
    • No es una solución ideal, pero voy a hacer en un apuro.
  5. 0

    La adición de estas dos líneas de -(void)viewDidAppear:(BOOL)animated trabajó para mí.

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

    Y no te olvides de llamar a <UIGestureRecognizerDelegate> a .h archivo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea