2010-11-30 34 views
5

Me gustaría cambiar el fondo de mi UINavigationBar a [UIColor colorWithImage:], pero no está funcionando. ¿Qué me estoy perdiendo?¿Cómo cambio el fondo de un UINavigationBar?

EDIT:

Una vez que he creado mi subclase, ¿dónde puse el UINavigationController usarlo?

Respuesta

8

Usted puede utilizar la propiedad tintColor para cambiar el color de un UINavigationBar, sino para establecer una imagen como el fondo que tendrá que proporcionar su propia UINavigationBar subclase y sobreescribir el método drawRect:, por ejemplo:

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"background-image.png"]; 
    [img drawInRect:CGRectMake(0, 
           0, 
           self.frame.size.width, 
           self.frame.size.height)]; 
} 

Si usa el Interface Builder para construir su UI y luego usa la barra de navegación personalizada, simplemente seleccione el elemento UINavigationBar en Interface Builder, abra el Inspector y en la pestaña Identity especifique su subclase UINavigationBar en el campo de clase, así:

Example screenshot showing custom UINavigationBar subclass

+0

Ahora, ¿cómo puedo configurar el UINavigationBar para mostrar el interior de la UINavigationController? – Moshe

+0

Buena pregunta - respuesta modificada en consecuencia. –

+0

¿Es esto posible solo en código? Además, ¿esto rompe HIG para nada? – Moshe

7

Para tener una imagen en la barra de navegación, tiene que dibujarla usted mismo, que en realidad no es tan difícil. Guardar como UINavigationBar+CustomBackground.m (que añade una categoría personalizada a UINavigationBar):

@implementation UINavigationBar (CustomBackground) 

- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed:@"NavMain.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 
+1

El uso de una categoría cambiaría irrevocablemente el fondo de * todas * barras de navegación. Será mejor que uses una subclase. –

+0

usamos este método hasta que quisimos diferentes barras de navegación en diferentes controladores de vista. Entonces, lamentablemente, este método falla –

+0

En realidad amigos, es posible que pueda hacer una detección de clase y comportarse de manera diferente en función de la clase. Sin embargo, todavía tiene que volver a implementar los comportamientos predeterminados. – Moshe

Cuestiones relacionadas