2010-02-14 9 views
11

Duplicar posibles:
How to add background image on iphone Navigation bar?iPhone - navigationbar Fondo personalizado

Busco una manera de tener una barra de navegación personalizada y la necesidad de tener un fondo de la barra de navegación personalizado para lograr este . Estaba buscando cómo hacer esto, pero no pude encontrar una solución. Si alguien tiene la solución, la ayuda es muy apreciada.

+0

Hay más soluciones alternativas de solución aquí: http://stackoverflow.com/questions/1692487/how-to-add-background-image-on-iphone-navigation-bar –

Respuesta

6

Puede agregar una subvista (un UIImageView) a navaigationBar, que es solo una subclase de UIView.

UINavigationBar nb = [[UINavigationBar alloc]init]; 
[nb addSubview: foo]; 
[nb release]; 

Aquí hay un mensaje del foro que se describe cómo ajustar esto a una categoría: http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

10

(complementario a la respuesta de Andrew Johnson)

El puesto Apple.com vinculados con 3 ó 4 soluciones diferentes , la mayoría de los cuales solo funciona "a la mitad". Creo que el más elegante/efectiva de ellos es éste:

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

Sin embargo ... no es de buena práctica ObjC a OD que como una categoría (debe ser una anulación), y tiene algunos problemas de su propio.

Por lo tanto, una solución más general y de gran alcance está aquí:

http://samsoff.es/posts/customize-uikit-with-method-swizzling

+0

, gracias a la vinculación para mí Adam :) Tienes razón en que anular los métodos con categorías es una muy mala práctica. –

+0

¿Alguien votó negativamente esto sin explicación? No estoy seguro por qué. Aunque agregaría: toda esta pregunta (y la mayoría de las respuestas) son iOS 2/3/4 solamente - iOS 5 tiene un sistema completamente nuevo de hacer esto. La respuesta todavía funciona para las personas que están haciendo iOS4. – Adam

14

Desde IOS5, se puede configurar fácilmente un fondo personalizado, con el método setBackgroundImage: forBarMetrics: Pero usted debe comprobar si el teléfono del usuario tiene el sistema operativo correcto.

if ([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) 
{ 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"texture.png"] 
                forBarMetrics:UIBarMetricsDefault]; 
} 

Esta es una solución más agradable, porque está en el documento.

+0

Hasta que un usuario que no ejecuta iOS5 ejecute su aplicación – JoeCortopassi

+3

Sí, pero hay un cheque para eso. Puedes hacer algo más en la cláusula else. – Martin

3

Copie esto en viewDidLoad. Verificará iOS 5 y utilizará el método preferido, de lo contrario agregará una subvista a navBar para las versiones de iOS < 5.0. Esto funcionará siempre que su imagen de fondo personalizada no tenga transparencias.

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
NSLog(@"%f",version); 
UIImage *backgroundImage = [UIImage imageNamed:@"myBackgroundImage.png"]; 
if (version >= 5.0) { 
    [self.navigationController.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [self.navigationController.navigationBar insertSubview:[[[UIImageView alloc] initWithImage:backgroundImage] autorelease] atIndex:1]; 
} 
Cuestiones relacionadas