2009-05-23 21 views

Respuesta

6

Estaba buscando esto hace una semana. Encontré esto aquí discusiones. manzana. com/thread.jspa? threadID = 1649012 & tstart = 0 (lo siento no me permite publicar un enlace real).

-(void)setBackgroundImage:(UIImage*)image withTag:(NSInteger)bgTag{ 
if(image == NULL){ //might be called with NULL argument 
    return; 
} 
UIImageView *aTabBarBackground = [[UIImageView alloc]initWithImage:image]; 
aTabBarBackground.frame = CGRectMake(0,0,self.frame.size.width,self.frame.size.height); 
aTabBarBackground.tag = bgTag; 
[self addSubview:aTabBarBackground]; 
[self sendSubviewToBack:aTabBarBackground]; 
[aTabBarBackground release]; 
} 
/* input: The tag you chose to identify the view */ 
-(void)resetBackground:(NSInteger)bgTag { 
    [self sendSubviewToBack:[self viewWithTag:bgTag]]; 
} 

Hice esto como una categoría para UINavigationBar. una imagen de fondo para configurarlo para un UINavigationBar dentro de un UINavigationBarController, hice esto:

[navigationControllerForChannels.navigationBar setBackgroundImage:[UIImage imageNamed:@"top_bar.png"] withTag:48151623]; 

he tenido algo buginess al actualizar la barra de pestañas, por lo que desea llamar

[self.navigationController.navigationBar resetBackground:48151623]; 

Después de cualquier modificación a la barra.

1

una imagen de fondo va a tomar un poco más de trabajo (puede intentar establecer un titleView del mismo tamaño que la barra en sí mismo, no lo he probado yo mismo) o agregar una vista detrás de las subvistas existentes. El color del tinte es fácil: navBar.tintColor = [UIColor orangeColor];

8

Esto es como lo hice en iOS4:

#import <QuartzCore/QuartzCore.h> // For .layer 

self.navigationController.navigationBar.layer.contents = (id)[UIImage imageNamed:@"navigationBarBackgroundImage"].CGImage; 
self.navigationController.navigationBar.tintColor = [UIColor orangeColor]; 

No hay necesidad de cambiar subvistas entre Z-órdenes (-exchangeSubviewAtIndex: tanto la imagen de fondo y el conjunto tintColor en una línea de código withSubviewAtIndex :), y trabaja con @ Imagen 2x también.

+0

Con mucho, la mejor manera de hacer esto. – freespace

+0

Completamente segundo eso. El uso de sendSubviewToBack parece ocultar el texto del título de navigationController y todas las soluciones drawRect son exageradas. –

+0

roto en iOS5. –

3

Puede anular UINavigationBar drawRect. El código se puede colocar en appDelegate.m Lo he probado y funciona en iOS 3x y 4x.

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)drawRect:(CGRect)rect { 
    UIColor *color = [UIColor blackColor]; //tint color 
    UIImage *img = [UIImage imageNamed: @"navBarBg.png"]; // your image 
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    self.tintColor = color; 
}@end 
0

Si utiliza la solución CGImage, es posible que tenga un problema con el tamaño de la imagen:

CGRect layer=self.navigationController.navigationBar.frame; 
layer.size.height=57.0; 
layer.origin.y=0; 
self.navigationController.navigationBar.frame=layer; 
CGImageRef imageRef   = [UIImage imageNamed:@"myImg.png"].CGImage; 
self.navigationController.navigationBar.layer.contents = (id)imageRef; 

Me parece que la imagen está estirada hacia abajo, ya que la capa parece tener una altura de 44.0 píxeles, pero una imagen de fondo para UINavigationBar debe ser al menos 57.0.

Si intenta mover el marco de la capa, todos los botones se moverán dentro de él.

10

Para IOS5 usar las siguientes líneas de código:

UINavigationBar *navBar = [[self navigationController] navigationBar]; 
UIImage *backgroundImage = [UIImage imageNamed:@"nav-bar-background-normal"]; 
[navBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; 

para mantener la compatibilidad hacer una comprobación para ver si la barra de navegación responde a setBackgroundImage: forBarMetrics:

Más información sobre: ​​ http://sebastiancelis.com/2009/12/21/adding-background-image-uinavigationbar/

+0

¿Dónde pone exactamente estas tres líneas de código para que funcionen cuando se carga el controlador de vista de navegación? – BCXtreme

+0

Configúralo antes de que aparezca la vista. Puede configurarlo en viewWillAppear: animated: o viewDidLoad: para una viewController dada. Si está creando un nuevo navigationController, puede configurar backgroundImage después de la asignación. Si su mainWindow tiene navigationController, puede configurarlo en la aplicación: didFinishLaunchingWithOptions: before [self.window makeKeyAndVisible]; – Dare2Dream

+0

Tengo estas tres líneas de código en el método viewDidLoad para mi clase Custom NavigationController. Sin embargo, la barra de navegación sigue siendo negra opaca. ¿Hay algo más que deba hacer? Lo siento, soy nuevo en la programación de Xcode y iOS. – BCXtreme

2

Para iOS5 e iOS6 he usado estas soluciones y funcionó a la perfección, creando una imagen de fondo Universal UINavigationBar.

iPhone Retina Retrato de 640 x 88 píxeles/iPhone no Retina Retrato 320px x 44px

Dentro AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

colocar este código

// Set the status bar to black color. 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO]; 

// Change @"menubar.png" to the file name of your image. 
UIImage *navBar = [UIImage imageNamed:@"menubar.png"]; 

[[UINavigationBar appearance] setBackgroundImage:navBar forBarMetrics:UIBarMetricsDefault]; 

No se olvide de cambiar el nombre de la imagen (menubar.png)

Salida este enlace para obtener la respuesta completa http://www.lwxted.com/blog/2012/add-custom-background-image-uinavigationbar-ios-5/

Cuestiones relacionadas