ios ios7 uinavigationcontroller swipe

ios - io7 control de navegación cuando finaliza la transición



ios7 uinavigationcontroller (1)

La clave para resolver su problema se puede encontrar en la propiedad interactivePopGestureRecognizer de UINavigationController . Este es el reconocedor que responde por disparar controladores con un gesto de deslizamiento. Puede observar que el estado del reconocedor cambia a UIGestureRecognizerStateEnded cuando el usuario levanta el dedo hacia arriba. Entonces, además del delegado del Controlador de navegación, debe agregar el destino al Reconocedor de pop:

UIGestureRecognizer *popRecognizer = self.navigationController.interactivePopGestureRecognizer; [popRecognizer addTarget:self action:@selector(navigationControllerPopGestureRecognizerAction:)];

Esta acción se ejecutará cada vez que cambie el Reconocedor Pop, incluido el final de un gesto.

- (void)navigationControllerPopGestureRecognizerAction:(UIGestureRecognizer *)sender { switch (sender.state) { case UIGestureRecognizerStateEnded: // Next cases are added for relaibility case UIGestureRecognizerStateCancelled: case UIGestureRecognizerStateFailed: _isAnimating = NO; break; default: break; } }

PD ¡No olvide que la propiedad interactivePopGestureRecognizer está disponible desde iOS 7!

Quiero señalar que mi UINavigationController está animando (push / pop) o no.

Tengo una variable BOOL (_isAnimating) y el siguiente código parece funcionar:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { _isAnimating = YES; } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { _isAnimating = NO; }

Pero funciona incorrectamente en iOS7 con gesto deslizar. Supongamos que mi navegación es: root-> view A -> view B. Actualmente estoy en B.

  • Al comenzar a deslizar (retrocede de B a A), se llama a la función " navigationController:willShowViewController:animated:(BOOL)animated ", luego _isAnimating = YES .

  • El caso normal es que el deslizamiento haya finalizado (regrese a A), se llama a la función " navigationController:didShowViewController:animated:(BOOL)animated ", luego _isAnimating = NO . Este caso está bien, pero:

  • Si el usuario puede deslizar solo la mitad (la mitad de la transición a A), y luego no desea pasar a la vista anterior (ver A), vuelve a la vista actual (permanecer B de nuevo). Entonces la función " navigationController:didShowViewController:animated:(BOOL)animated " no se llama, mi variable tiene un valor incorrecto (_isAnimating=YES) .

No tengo oportunidad de actualizar mi variable en este caso anormal. ¿Hay alguna forma de actualizar el estado de navegación? ¡Gracias!