2010-06-25 24 views
14

Mi aplicación tiene un controlador de navegación y no quiero ningún tipo de animación en ella:¿Evitar la animación al hacer clic en el botón "Atrás" en la barra de navegación?

  • para evitar una animación cuando se empuja una vista, es fácil, a través de la pushViewController: animada: Método

  • pero cuando hago clic en el botón "Atrás" en esta subvista, ¡hay una animación! KO! ¿Qué puedo hacer para evitar esta animación?

+7

¿Por qué quiere romper la interfaz de usuario con un comportamiento no estándar? –

+10

No es que quiera romper la UI con un comportamiento no estándar. Simplemente no entiendo por qué el SDK tiene control para un impulso para ser animado o no, pero no tiene el mismo control para un pop. Siento que es inconsistente. –

+1

comportamiento no estándar nos hace crecer :) – Zac

Respuesta

3

Más elegante con una categoría. Esto supone que su objeto de controlador de navegación está configurado en su delegado de aplicación. Simplemente ponga esto antes de su @implementaion en el controlador de vista raíz.

#import "AppDelegate.h" 

@implementation UINavigationBar (custom) 
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; 
{ 

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

    [delegate.navController popViewControllerAnimated:NO]; 

    return TRUE; 
} 


@end 
+1

Gracias por su respuesta, acabo de probarlo y realmente funciona, pero es sorprendente porque usted devuelve VERDADERO por algo esperando un UINavigationItem. –

+1

Además, esta solución funciona si tiene 1 y solo 1 controlador de navegación en su aplicación. No funcionará con múltiples controladores de navegación. –

+0

simplemente rebotando sobre mi cabeza. Plz explicativo. soy nuevo bie. Thals –

2

No es que usted debe, sin embargo, puede reemplazar el comportamiento estándar mediante la creación de una costumbre leftBarButtonItem en su viewController.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 
[[self navigationItem] setLeftBarButtonItem:item]; 
[item release]; 

- (void)backButtonPressed 
{ 
    [[self navigationContoller] popViewControllerAnimated:NO]; 
} 

El documentation dice que sólo debe pasar antes de NO se muestra la vista del controlador de navegación.

Recuerde que las aplicaciones que no se ajusten a las pautas de la interfaz de iPhone no serán aceptadas en la tienda de aplicaciones.

+0

Ese código tiene errores, e incluso entonces solo funciona parcialmente. No obtendrá el botón de forma de "flecha". Typo en su código - falta "]" en la línea 1. Además, su código en la línea 2 es incorrecto - Creo que debería decir: "[self.navigationItem setLeftBarButtonItem: item];" w.r.t. "es esto aceptable por Apple": 1. Eso no es cierto: se aceptan muchas aplicaciones que infringen el HIG; muchas de las aplicaciones propias de Apple lo violan flagrantemente. 2. Siempre que desee hacer un par de animación push/pop personalizado, NECESITA desactivar el predeterminado (ya que Apple no proporciona una API pública para anularlo). – Adam

+0

Gracias por su respuesta. Sin embargo, estoy de acuerdo con Adam: la forma de "flecha" es DEBE tener en una aplicación de iPhone. –

+0

Siempre puede volver a crear la imagen de la flecha. Creo que es una práctica bastante común, ya que Apple no te da una manera de hacer uno programáticamente. – livingtech

3

Vine a SO en busca de una solución más elegante, pero así es como he estado (con éxito) haciéndolo hasta ahora.

La idea básica:

  1. no utilice UINavigationController; en lugar de utilizar sus partes constituyentes (por ejemplo UINavigationBar) y hacer el trabajo usted mismo
  2. Gatillo la barra de navegación para animar en paralelo con sus propias animaciones personalizadas (o no, si no desea anim en absoluto)

Las desventajas:

  1. UINavigationController maneja algunas otras cosas, como la carga/descarga de memoria, automáticamente. Además, está "codificado" en todos los UIViewControllers, SIEMPRE tienen una referencia al UINavigationController que los contiene. Es una pena desperdiciar todo esto solo porque Apple no proporciona un gancho para configurar anims personalizados.

Código - en cualquier clase se hace cargo de la animación:

UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"]; 
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE]; 
// next line only needed if you want a custom back anim too 
navigationController.navigationBar.delegate = self; 

... si también desea cortar en la espalda con la costumbre de animación, es necesario que la última línea anterior, de modo que usted puede entonces escuchar la barra de navegación, y reaccionar en paralelo, así:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
{ 
    // trigger your custom back animation here 

    return TRUE; 
} 
+0

¡Gracias por tu respuesta! Pero tiene razón: soy demasiado perezoso para descartar todas las características de UINavigationController y prefiero permitir que ocurra la animación;) –

+3

*** Aplicación de terminación debido a la excepción no detectada 'NSInternalInconsistencyException', razón: 'No se puede establecer manualmente la delegar en un UINavigationBar administrado por un controlador. ' –

+0

Vuelva a leer el paso 1 anterior – Adam

3

Esto evita que la animación por defecto.

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 

En caso si usted necesita una animación personalizada

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 

    CATransition *transition = [CATransition animation]; 
    transition.duration = 0.3; 
    transition.type = kCATransitionFade; 
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 
Cuestiones relacionadas