tab que bar ios uiviewcontroller uinavigationcontroller ios7 uimodaltransitionstyle

que - iOS7 UIModalTransitionStyleFlipHorizontal rebota después de la transición



view controller que es (6)

Estoy actualizando mi aplicación para iOS 7 y descubrí un problema extraño. Presentaré un UIViewController envuelto en un UINavigationController con UIModalTransitionStyleFlipHorizontal .

En iOS 6 funciona bien, pero en iOS 7 la barra de navegación rebota después de la transición. ¿Tiene esto algo que ver con la barra de estado? Establecí la translucidez de la barra de navegación principal en NO .

En Info.plist, la apariencia de la barra de estado basada en el controlador View está establecida en NO.

Y aquí hay un GIF que muestra el problema en una aplicación de demostración mínima:

Aquí está mi código:

feedNavigationController = [[UINavigationController alloc] init]; feedNavigationController.navigationBar.translucent = NO; SettingsViewController *settingsVC = [[SettingsViewController alloc] init]; feedNavigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [feedNavigationController setViewControllers:[NSArray arrayWithObjects:settingsVC, nil]]; [self presentViewController:feedNavigationController animated:YES completion:nil];


Esto parece ser un error de UIKit. La siguiente solución parece resolver el problema para mí.

presentViewController (coloca esto en el controlador de vista al que estás presentViewController transición):

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; }

dismissViewControllerAnimated (coloque esto en el controlador de vista al que desestime):

- (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; [self.navigationController.navigationBar.layer removeAllAnimations]; }

si no usas el autolayout . necesita agregar esto al controlador de vista al que dismiss :

- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.view setNeedsLayout]; }


Esto parece ser un error de UIKit. La siguiente solución parece resolver el problema para mí.

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; }

(Coloque esto en el controlador de vista al que está haciendo la transición).


Lo mismo para mi. Lo que realmente funcionó es cambiar el estilo a CoverVertical, se ve mucho más suave.


Para resolver este problema para el presente y descartar, utilizo la transición personalizada iOS7.

Agregue esto a su UIViewController:

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source { return (id<UIViewControllerAnimatedTransitioning>)self; } - (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed { return (id<UIViewControllerAnimatedTransitioning>)self; } - (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext { return 0.7f; } - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext { UIView *containerView = [transitionContext containerView]; UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; [containerView addSubview:fromVC.view]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [containerView addSubview:toVC.view]; UIViewAnimationOptions animationOption = ([toVC.presentedViewController isEqual:fromVC])?UIViewAnimationOptionTransitionFlipFromLeft:UIViewAnimationOptionTransitionFlipFromRight; [UIView transitionFromView:fromVC.view toView:toVC.view duration:[self transitionDuration:transitionContext] options:animationOption completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; }

Para usarlo, solo tienes que comprobar si estás en iOS7 y configurar la transiciónDelegate:

YourVCWithTheCustomTransition* yourVC = [[YourVCWithTheCustomTransition alloc] init]; CGFloat deviceVersion = [UIDevice currentDevice].systemVersion.floatValue; if(deviceVersion >= 7.0) [yourVC setTransitioningDelegate:yourVC]; [self presentModalViewController:yourVC animated:YES]; [yourVC release];

En mi caso, tenía un UINavigationController personalizado donde se define la transición personalizada: no tengo que hacer esto cada vez.


Tanto para el controlador de vista presentado como para el presentado, tengo un UITableViewController dentro de UINavigationController , ambos configurados usando Diseño Automático. Noté que las otras respuestas no resolvieron el problema que al descartar la vista de tabla del controlador de vista de presentación salta 20 pt verticalmente.

Esta solución aborda este problema.

En el controlador de vista presentado (como lo propuso Ben Packard):

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar.layer removeAllAnimations]; }

En el controlador de vista de presentación (como se propone en parte por polvoriento):

- (void)viewWillLayoutSubviews{ if (self.navigationController.presentedViewController) { [self.navigationController.navigationBar.layer removeAllAnimations]; [self.tableView.layer removeAllAnimations]; } [super viewWillLayoutSubviews]; }


Tuve el mismo problema y pude "resolverlo" (no es una solución real al problema, pero se ve bien :)). El truco está en el controlador de vista que usa pushViewController / popViewController con una animación UIView para hacer una voltereta. Aquí hay un código de ejemplo para presentar el controlador de vista:

UIViewController *viewController = [[UIViewController alloc] init]; [UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [self.navigationController pushViewController:viewController animated:NO]; } completion:nil];

Para descartarlo:

[UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromRight animations:^{ [self.navigationController popViewControllerAnimated:NO]; } completion:nil];

Si no desea que la [self.navigationController setNavigationBarHidden:YES animated:NO] navigationBar en el controlador empujado simplemente llame a [self.navigationController setNavigationBarHidden:YES animated:NO] en viewWillAppear . Espero que este enfoque te ayude.