31

Me gustaría que una imagen ocupe toda la barra de navegación. Esta es la navegación que viene con una aplicación basada en la navegación. Aparece en RootViewController con el UITableView que lo acompaña. He visto algunos ejemplos de cómo esto podría funcionar.Agregar imagen a la barra de navegación

conjunto de títulos de la barra de navegación:

UIImage *image = [UIImage imageNamed:@"TableviewCellLightBlue.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
[self.navigationController.navigationBar.topItem setTitleView:imageView]; 

El problema no es sólo cubre el título en lugar de toda la barra de navegación.

También hay este hilo: http://discussions.apple.com/message.jspa?messageID=9254241#9254241. Hacia el final, la solución parece usar una barra de pestañas, que no estoy usando. ¿Es tan complicado establecer un fondo de barra de navegación? ¿Hay alguna otra técnica más simple?

Me gustaría tener un fondo para la navegación y aún poder usar el texto del título.

Respuesta

36

En su caso, this solution found in another answer funcionaría bien.

Con la categoría "CustomImage" añadido a UINavigationBar, continuación, puede simplemente llamar:

UINavigationBar *navBar = self.navigationController.navigationBar; 
UIImage *image = [UIImage imageNamed:@"yourNavBarBackground.png"]; 
[navBar setBackgroundImage:image]; 

Este código debe ir en el método

- (void)viewWillAppear:(BOOL)animated 

del controlador de la vista en la que desea tener la imagen personalizada. Y, en ese caso, debería mejor llamar:

[navBar clearBackgroundImage]; // Clear any previously added background image 

antes setBackgroundImage (de lo contrario, se añadirá varias veces ...)

+0

Perfecto. Gracias. Además, ¿sabes cómo puedo configurar el color de la barra de título? Lo he intentado pero no funciona: [self.navigationController.navigationBar.titleView setBackgroundColor: [UIColor blueColor]]; – 4thSpace

+0

También he intentado [navBar setBackgroundColor: [UIColor blueColor]]; – 4thSpace

+0

Existe la propiedad tintColor: prueba navBar.tintColor = [UIColor blueColor]; –

8

realidad, hay una manera mucho más fácil añadir una imagen de fondo a cualquier UIView clase o subclase. No requiere categorización de clase o extensión (subclases), y puede hacer esto "según sea necesario". Por ejemplo, para agregar una imagen de fondo a la barra de navegación de un controlador de vista, haga lo siguiente:

self.navigationController.navigationBar.layer.contents = (id)[UIImage 
    imageNamed:@"background.png"].CGImage; 

Tendrá que recuerde agregar el marco de cuarzo Core a su proyecto y añadir #import <QuartzCore/QuartzCore.h> siempre que se necesite para hacer esto . Esta es una manera mucho más limpia y más simple de alterar la capa de dibujo de cualquier cosa que herede de UIView. Por supuesto, si desea lograr un efecto similar para todas las barras de navegación o tabuladores, entonces la creación de subclases tiene sentido.

9
UIImage *image = [UIImage imageNamed:@"YourImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

[self.navigationController.navigationBar addSubview:imageView]; 
3

utilicé solución cmp 's y ha añadido algo de lógica para eliminarlo, ya que sólo quería una imagen de fondo personalizada en la pantalla principal en la vista aparecerá.

HomeViewController.m

UIImage *image = [UIImage imageNamed:@"HomeTitleBG.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
imageView.tag = 10; 

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10]; 

if (testImgView != nil) 
{ 
    NSLog(@"%s yes there is a bg image so remove it then add it so it doesn't double it", __FUNCTION__); 
    [testImgView removeFromSuperview]; 

} else { 
    NSLog(@"%s no there isn't a bg image so add it ", __FUNCTION__); 
} 

[self.navigationController.navigationBar addSubview:imageView]; 


[imageView release]; 

También probé a usar el método sugerido clearBackgroundImage pero no pude conseguir que funcione así que me dio la imagen de una etiqueta y luego se retira en las otras viewcontrollers en vista aparecerá .

OtherViewController.m

UIImageView *testImgView = (UIImageView *)[self.navigationController.navigationBar viewWithTag:10]; 

if (testImgView != nil) 
{ 
    NSLog(@"%s yes there is a bg image so remove it", __FUNCTION__); 
    [testImgView removeFromSuperview]; 
} 

`

4
UIImage *logo = [UIImage imageNamed:@"my_logo"]; 
UIImageView *logoView = [[UIImageView alloc]initWithImage:logo]; 
logoView.frame = CGRectMake(0, 0, 320, 37); 

UINavigationController *searchNavCtrl = [[UINavigationController alloc] initWithRootViewController:searchViewController]; 
searchNavCtrl.navigationBar.barStyle = UIBarStyleBlack; 


//searchNavCtrl.navigationItem.titleView = logoView; 
//[searchNavCtrl.navigationController.navigationBar.topItem setTitleView:logoView]; 
[searchNavCtrl.navigationBar addSubview:logoView]; 

[logoView release]; 
23

es cambiado para iOS6, hacer que funcione en iOS 6 uso:

UINavigationBar *navBar = self.navigationController.navigationBar; 
UIImage *image = [UIImage imageNamed:@"image.png"]; 
[navBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 
4

Apenas añada esta línea.

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"NavBar.png"] forBarMetrics:UIBarMetricsDefault]; 

Bam! Una línea y hecho.

+2

lol jk esta es una de las mejores respuestas que he visto en mi vida! – GangstaGraham

0

sólo tiene que ir al controlador de vista y pegar en el Super viewDidLoad y vuelva a colocar su imagen en mainlogo y luego establecer el título de navegación de configurar su imagen logo

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //set your image frame 
    UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0,0,70,45)] ; 

    //set your image logo replace to the main-logo 
    [image setImage:[UIImage imageNamed:@"main-logo"]]; 

    [self.navigationController.navigationBar.topItem setTitleView:image]; 

} 
+2

¿Cómo mejora esto en otras respuestas aquí? – Mark

+0

@yogesh Ya sabes la respuesta, pero creo que el código se ve muy bonito con algunos comentarios/pasos. –

+0

@Mark puede agregar esto en superview didload y –

0

Añadir un código en AppDelegate terminó con el lanzamiento de método

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0) 
{ 
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault]; 
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault]; 
} 
else 
{ 
    [[UINavigationBar appearance] setBarTintColor:UIColorFromRGB(0x067AB5)]; 

    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; 

    // Uncomment to assign a custom backgroung image 
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navigation_or.png"] forBarMetrics:UIBarMetricsDefault]; 

    // Uncomment to change the back indicator image 
    [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]]; 

    [[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]]; 
    [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@""]]; 

    // Uncomment to change the font style of the title 

    NSShadow *shadow = [[NSShadow alloc] init]; 
    shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; 
    shadow.shadowOffset = CGSizeMake(0, 0); 

    [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,shadow, NSShadowAttributeName,[UIFont fontWithName:@"HelveticaNeue-Bold" size:17], NSFontAttributeName, nil]]; 

    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:0.0 forBarMetrics:UIBarMetricsDefault]; 
} 
Cuestiones relacionadas