2011-10-14 34 views
22

He estado tratando de cambiar la imagen de fondo de la UINavigationBar de mi solicitud. Lo intenté de varias maneras. Primero agregué a mi clase AppDelegate el siguiente código:Cambiar la imagen de fondo UINavigationBar

@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 

Pero no funcionaba. Mi siguiente intento fue escribir una clase CustomizedNavigationBar que está anulando el método drawRect. Parecía que:

CustomizedNavigationBar.h

#import <UIKit/UIKit.h> 

@interface CustomizedNavigationBar : UINavigationBar 

@end 

CustomizedNavigationBar.m

#import "CustomizedNavigationBar.h" 

@implementation CustomizedNavigationBar 

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

    NSLog(@"I got called!!!!!"); 
} 

@end 

En mi archivo .xib donde el navigationbar se define he cambiado la clase a la nueva CustomizedNavigationBar. Pero todavía no está funcionando ..

Como otra prueba de que he descargado un proyecto de ejemplo en el que la imagen de fondo debe ser cambiado. Pero incluso con ese código de muestra, no funcionaba.

¿Qué estoy haciendo mal? Estoy usando IOS 5. ¿Alguna sugerencia u otras formas en que podría definir una imagen de fondo?

Gracias por sus respuestas!

+0

fin tengo una solución de trabajo
[http://stackoverflow.com/questions/9304817/uinavigationbar-setting-background-image][1] [1]: http: // stackoverflow.com/questions/9304817/uinavigationbar-setting-background-image –

+0

Duplicado obsoleto de https://stackoverflow.com/questions/43602848/ –

Respuesta

77

A partir de iOS 5 se debe utilizar el setBackgroundImage:forBarMetrics: método:

[myNavbar setBackgroundImage:[UIImage imageNamed: @"UINavigationBarBackground.png"] 
       forBarMetrics:UIBarMetricsDefault]; 

Y en Swift:

navigationBar.setBackgroundImage(UIImage(named: "UINavigationBarBackground.png"), 
       forBarMetrics: .Default) 
+0

Gracias. ¡Está funcionando! – Prine

+1

¿Cómo podemos configurar el elemento de la barra de navegación en este patrón de color de imagen? – Ramz

+0

Para una mejor solución y diferentes tamaños de pantalla, consulte las categorías https://stackoverflow.com/questions/43602848/ –

0

Puede agregar UIImageview a la barra de navegación de la siguiente manera UINavigationBar navBar = [[UINavigationBar alloc] init]; [navBar addSubview: imageview]; [versión de NavBar];

Puede comprobar el mensaje: iPhone - NavigationBar Custom Background

+0

Sí, también probé esto. Pero luego ya no puedo ver el título ni los botones. – Prine

1

Sólo trate con este código. En su archivo de implmentación (.m).

#import "RootViewController.h" 

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

@implementation RootViewController

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 

    [email protected]"You are Done."; 
} 

Esto ha funcionado en forma excelente para mí.

Código anterior Trabajó solo para iOS 4. Si usa el IOS 5, utilice .....

[myNavbar setBackgroundImage:[UIImage imageNamed: 
@"UINavigationBarBackground.png"] 
        forBarMetrics:UIBarMetricsDefault]; 
+1

que impulsan el método 'drawRect:' ya no funcionarán en iOS 5 ya que ese método no se llama en la clase de todos modos (framework usa otras técnicas). Solo las subcatas pueden agregar un método drawRect. Existe cierta compatibilidad binaria para invocar categorías, pero solo cuando compila con iOS 4 SDK –

+0

@MartinUllrich ¡Gracias por su explicación! – Prine

+0

Si esto no va a funcionar, entonces uno puede probar con CustomToolbar. –

0

Bueno para iOS 4 hay una solución simple, como:

nvc.navigationBar.layer.contents = (id)img.CGImage; 
8

Teniendo en cuenta todas las versiones de iOS, esto parece estar logrando tanto personalizado de imagen de fondo y el tamaño de encargo de UINavigationBar:

@interface CustomNavigationBar : UINavigationBar 
@end 

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

    //for iOS5 
    [self setBackgroundImage:[UIImage imageNamed: @"navigationBar"] forBarMetrics:UIBarMetricsDefault]; 
} 

//for custom size of the UINavigationBar 
- (CGSize)sizeThatFits:(CGSize)size { 
    CGSize newSize = CGSizeMake(320,31); 
    return newSize; 
} 

@end 

Utilizo dichos códigos en un lugar común como un archivo de Utilidades.

Espero que esto ayude.

+0

perfecto! =) Funciona: P – kappatech

0

También puede probar esto para Fondo de barra de navegación.

UINavigationBar *navigationBar = self.navigationController.navigationBar; 
UIImage *image = [UIImage imageNamed: @"NavBar-Wood.png"]; 
[navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
self.navigationController.navigationBar.tintColor = [UIColor brownColor]; 

Gracias.

0

Otra forma de establecer una imagen en la barra de navegación es,

UIImage* logo = [ UIImage imageNamed:@"Logo.png" ]; 
UIImageView* logoView = [[[UIImageView alloc] initWithImage:logo] autorelease]; 
self.navigationItem.titleView = logoView; 

esto no va a cambiar toda fondo de la barra de navegación. Pero agrega una imagen de fondo centrada en la barra de navegación, que en algún momento es más intencionada (lo que estaba buscando).

Cuestiones relacionadas