tutorial guide framework developer apple ios cocoa-touch uikit ios7

ios - guide - La barra de navegación se ajusta después de llamar Transición completa: en transición personalizada



ios documentation (4)

Agregue primero toViewControllerView a ContainerView, luego configure la transformación toViewControllerView como se indica a continuación.

[contenedor addSubview: toViewController.view];

toViewController.view.transform = transform;

Esto solucionará el problema.

Mi objetivo es proporcionar una transición modal de acercamiento para el usuario desde una vista similar a la de los iconos de trampolín cuando se inician aplicaciones.

El controlador de vista presentado se acerca correctamente, pero la barra de navegación tiene una posición incorrecta debajo de la barra de estado. Esta posición se corrige después de llamar a [transitionContext completeTransition: completed] ;. ¿Cómo puedo corregirlo desde el comienzo de la transición?

Esta es una grabación de pantalla del error: http://youtu.be/7LKU4lzb-uw (la falla se encuentra en el sexto segundo de la grabación)

El código UIViewControllerAnimatedTransitioning:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *container = [transitionContext containerView]; CGPoint viewCenter = self.view.center; CGSize viewSize = self.view.frame.size; CGSize controllerSize = toViewController.view.frame.size; CGFloat controllerFromX = viewCenter.x - (controllerSize.width / 2); CGFloat controllerFromY = viewCenter.y - (controllerSize.height / 2); CGAffineTransform transform = CGAffineTransformMakeTranslation(controllerFromX, controllerFromY); transform = CGAffineTransformScale(transform, viewSize.width / controllerSize.width, viewSize.height / controllerSize.height); if (self.reverse) { [container insertSubview:toViewController.view belowSubview:fromViewController.view]; } else { toViewController.view.transform = transform; [container addSubview:toViewController.view]; } [UIView animateKeyframesWithDuration:ZoomTransitioningDuration delay:0 options:0 animations:^{ if (self.reverse) { fromViewController.view.alpha = 0.0f; fromViewController.view.transform = transform; } else { toViewController.view.transform = CGAffineTransformIdentity; } } completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; }


El problema es que está configurando la transformación antes de insertar la vista del controlador de vista de destino en el contenedor.

Cambiar el orden debería arreglarlo:

if (self.reverse) { [container insertSubview:toViewController.view belowSubview:fromViewController.view]; } else { [container addSubview:toViewController.view]; toViewController.view.transform = transform; }

Vea el punto 4 here . Dado que ha aplicado una transformación antes de insertar la vista del controlador de navegación como una subvista, el motor de diseño no cree que la barra de navegación esté en el borde superior de la ventana y, por lo tanto, no es necesario ajustarla para evitar el estado bar.


Esto sigue siendo un truco, basado en el de Ondřej Mirtes, pero funciona mejor si tienes una barra de estado durante la llamada y estás en iOS8

if([toViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navCtrl = (UINavigationController *)toViewController; UINavigationBar *navBar = navCtrl.navigationBar; if(navBar.frame.origin.y == 0 && navBar.frame.size.height == 44) { navBar.frame = CGRectMake(0, 0, navBar.frame.size.width, fmin(44 + [UIApplication sharedApplication].statusBarFrame.size.height, 64)); } }

Sin embargo, sigue siendo feo: /


He encontrado una solución, aunque bastante hacky. Tengo que ajustar manualmente el marco de la barra de navegación antes de que comience la animación:

if (self.reverse) { [container insertSubview:toViewController.view belowSubview:fromViewController.view]; } else { toViewController.view.transform = transform; [container addSubview:toViewController.view]; // fix navigation bar position to prevent jump when completeTransition: is called if ([toViewController isKindOfClass:[UINavigationController class]]) { UINavigationController* navigationController = (UINavigationController*) toViewController; UINavigationBar* bar = navigationController.navigationBar; CGRect frame = bar.frame; bar.frame = CGRectMake(frame.origin.x, frame.origin.y + 20.0f, frame.size.width, frame.size.height); } }