Cómo overar la apariencia de UINavigation Bar si ya está personalizada

En el delegado de la aplicación dentro de mi aplicación, invoco el siguiente método:

- (void)customizeAppearance { UIImage *gradientPortrait = [[UIImage imageNamed:@"gradient_portrait"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; UIImage *gradientLandscape = [[UIImage imageNamed:@"gradient_landscape"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; [[UINavigationBar appearance] setBackgroundImage:gradientPortrait forBarMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setBackgroundImage:gradientLandscape forBarMetrics:UIBarMetricsLandscapePhone]; } 

Este código permite personalizar todas las barras de navigation dentro de la aplicación. Cada barra se vuelve verde ya que la image que uso es verde.

Ahora mi objective es completar la configuration anterior para una barra de navigation específica. En particular, durante el ciclo de vida de la aplicación, abro un controller modal utilizando el estilo de presentación UIModalPresentationFormSheet . Este controller se presenta dentro de un UINavigationController . Como también necesito mostrar la barra de navigation adjunta a ese UINavigationController , me gustaría saber cómo es posible personalizar esa barra, sin cambiar la configuration global que establecí en el delegado de la aplicación.

Intenté establecer tanto la propiedad tintColor de la barra de navigation (presentada de manera modal) como [UIColor blackColor] y el barStyle a UIBarStyleBlack , pero no funcionan. Solo se afectan los artículos de los espolones.

Gracias de antemano.

PS estoy usando iOS 5

En primer lugar, si no te importa tu image estirada, no necesitas usar el método resizableImageWithCapInsets: UIEdgeInsetsMake (0, 0, 0, 0).

 UIImage *gradientPortrait = [UIImage imageNamed:@"gradient_portrait"]; UIImage *gradientLandscape = [UIImage imageNamed:@"gradient_landscape"]; UIImage *someOtherImage = [UIImage imageNamed:@"someOtherImageName"]; 

Entonces, para lograr lo que quieres:

  1. Asegúrese de que subclass el ViewController con la barra de navigation personalizada.
  2. Use lo siguiente para agregar la image pnetworkingeterminada a todas sus barras de navigation

     [[UINavigationBar appearance] setBackgroundImage:gradientPortrait forBarMetrics:UIBarMetricsDefault]; 
  3. Use lo siguiente para agregar la image específica a las barras de navigation que aparecerán arriba de los controles de subclass ViewControllers

     [[UINavigationBar appearanceWhenContainedIn:[YOURSUBCLASS class], nil] setBackgroundImage:someOtherImage forBarMetrics:UIBarMetricsDefault]; 

(puede llamar a estos methods desde algún lugar del delegado de su aplicación)

Por cierto, si solo quieres cambiar el color del tinte, puedes usar la propiedad tintColor en lugar de todas las imágenes.

Para get más información, consulte las secciones de apariencia de: UINavigationBar Class Reference

Subclass UINavigationBar con su class personalizada y apariencia diferente en él. Luego, use su class personalizada en ese lugar en particular en el que se verá diferente.