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!