ios uinavigationcontroller ios9 custom-transition

Transición personalizada para la animación push con NavigationController en iOS 9



uinavigationcontroller ios9 (1)

Logré solucionar mi problema agregando la siguiente línea antes de agregar una addSubview: :

toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];

De la documentación de Apple para finalFrameForViewController:

Devuelve el rectángulo del cuadro final para la vista del controlador de vista especificado.

El rectángulo devuelto por este método representa el tamaño de la vista correspondiente al final de la transición. Para la vista que se cubre durante la presentación, el valor devuelto por este método podría ser CGRectZero, pero también podría ser un rectángulo válido.

Tengo una transición de inserción personalizada entre los controladores de vista incrustados en un UINavigationController que funciona bien cuando está construido con iOS 7/8 pero presenta un diseño incorrecto cuando se construye en iOS 9 SDK.

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; [transitionContext.containerView addSubview:toViewController.view]; ...

Luego continúa y realiza una animación. El problema es que el contenido de toViewController , aunque utiliza la restricción de diseño automático de la guía de diseño superior derecha, presenta el contenido detrás de la barra de navegación.

Sin embargo, funciona bien en iOS 8 y si forzamos un rediseño (por ejemplo, enviar la aplicación al fondo y traerla de vuelta, presentar un modal en la parte superior y descartarla, etc.) causará que todo el sistema de diseño automático se vuelva a dibujar y La vista de toViewController salta al lugar correcto (como la guía de diseño superior, x píxeles de la barra de navegación en lugar de x píxeles desde la parte superior de la pantalla del dispositivo).

Añadiendo

[self.view setNeedsUpdateConstraints]; [self.view layoutIfNeeded];

Funciona si se coloca en viewDidAppear:animated , pero no funciona en viewDidLoad o viewWillAppear:animated . Esta no es una solución ya que los usuarios verían la vista saltando cuando el redibujado ocurra en viewDidAppear:animated