2012-06-23 9 views
5

En un segue costumbre, tengo la siguiente transición sencilla:animación personalizada para UINavigationController No empuje haciendo barra de navegación correctamente

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionWithView:src.navigationController.view duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        animations:^{ 
         [src.navigationController pushViewController:dst animated:NO]; 
        } 
        completion:NULL]; 
} 

El contenido de vista anima bien. Sin embargo, al ejecutar la animación, la barra de navegación en la parte superior tiene un diseño desordenado (botones todos abarrotados en la esquina superior izquierda, sin título), apareciendo en su lugar solo cuando finaliza la animación. ¿Alguien sabe lo que he hecho mal y cómo solucionarlo? ¡Gracias!

Respuesta

5

Descubrí mi problema. El código original es de hecho incorrecto dado el funcionamiento del UINavigationController e interactúa con los UIViewControllers que administra. (Cosas fastidio que como lo que hice en el PO se puede encontrar como una solución en mayores para los mensajes.)

Aquí es el código que funciona para mí (con un detalle sin importancia):

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionFromView:src.view 
         toView:dst.view 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [UIView transitionFromView:src.navigationItem.titleView 
         toView:dst.navigationItem.titleView 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [src.navigationController pushViewController:dst animated:NO]; 
} 

Quibble: esto anima la barra de navegación por separado de la vista de contenido, por lo que tienes dos piezas volteando en lugar de toda la pantalla. Había intentado hacer originalmente:

[UIView transitionFromView:src.navigationController.view 
         toView:dst.navigationController.view 

Pero eso no funciona porque la propiedad navigationController el 1) de destino no está aún establecido todavía hasta que se inserta en un controlador de navegación, y 2) incluso si fuera estaría refiriendo a la misma vista! Olvidé que

La vista por un controlador de navegación es sólo un contenedor para varios otros vistas, incluyendo una barra de navegación, una barra de herramientas opcional, y la vista que contiene su contenido personalizado ... Aunque el contenido de la de navegación barra de vistas y la barra de herramientas, los cambios de las vistas sí mismas no ... el objeto controlador de navegación se basa el contenido de la barra de navegación utilizando dinámicamente los elementos de navegación (instancias de la clase UINavigationItem) asociado a los controladores de vista de la pila de navegación. Para cambiar el contenido de la barra de navegación, , debe configurar los elementos de navegación para su vista personalizada controladores. (docs)

+0

¿Alguien puede explicar por qué esto fue downvoted? – qix

+0

¡Muchas gracias! El código eliminado me ayudó a descubrir cómo puedo animar solo el cambio de barra de navegación durante la inserción, pero no el cambio de vista de contenido – Denis

0

¿Otro "quibble"? puse

[src.navigationController pushViewController:dst animated:YES]; 

antes

[UIView transitionFromView ... 

para que el controlador de navegación se encuentran a método viewDidLoad del destino.

Cuestiones relacionadas