8

utilizo el siguiente código como una extensión de UINavigationController para empujar un controlador de vista con una animación personalizada:Empujar un UITableViewController con animación personalizada siempre anima UINavigationItem Título

@implementation UINavigationController (PushAnimation) 

- (void)pushViewController:(UIViewController*)controller withTransition:(UIViewAnimationTransition)transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

@end 

está activada la caché, aparece un comportamiento extraña animación al presionar UITableViewController. El título de la vista presionada aparece después de que se completa la animación personalizada. Con el estilo de transición UIViewAnimationTransitionNone, queda claro que el título está animado. Se mueve desde la esquina superior izquierda de la pantalla al centro de UINavigationBar.

Con el almacenamiento en caché desactivado, esta animación no es visible debido a su velocidad, pero la velocidad de fotogramas disminuye significativamente.

¿Cómo puedo evitar que el título sea animado?

+1

Creo que la animación del título está sucediendo en el código 'UINavigationBar'. Una idea sería subclasificar eso también y cambiar su comportamiento predeterminado – adig

Respuesta

0

Solo una actualización rápida de lo que fue mi solución al final. No fue posible anular el comportamiento predeterminado de UINavigationBar, ya que iOS usa una API privada para implementar la animación. Así que terminé la eliminación de todas las animaciones en el UINavigationBar, y sus diversos subvistas, usando el siguiente código:

[self.navigationBar.layer removeAllAnimations]; 
for (UIView *view in self.navigationBar.subviews) { 
    [view.layer removeAllAnimations]; 
    for (UIView *sub in view.subviews) { 
     [sub.layer removeAllAnimations]; 
    } 
} 

Es importante que esto se llama después de [self pushViewController:controller animated:NO];.

0

El problema es que usted es animando vista completa self.view. self.view contiene el controlador de vista así como el UINavigationBar. Por lo tanto, probablemente tendrá que obtener todas las subvistas de self.view y luego animar solo el view correspondiente a su controlador de vista.

+0

Bueno, también quiero animar la barra de navegación, ya que quiero que cambie toda la pantalla, no solo el contenido debajo de UINavigationBar. El problema es que parece que no puedo deshabilitar la navegación predeterminada de UINavigationbar. –

0

Usa este código para personalizar la animación de transición de navegación de una manera muy sencilla:

CATransition* transition = [CATransition animation]; 
transition.duration = 0.5; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom; 
transition.subtype = kCATransitionFromRight; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 
[[self navigationController] popViewControllerAnimated:NO]; 

y lo mismo para empujar.

** Asegúrese de #import <QuartzCore/QuartzCore.h> en su clase, y también añadir el marco de su proyecto

destino> Construir Fases> Enlace Binario Con Bibliotecas> el botón "+"> QuartzCore.framework

. **

Cuestiones relacionadas