Como adicionar imagem de fundo na barra de navegação do iPhone?

Eu quero adicionar um fundo de imagem, para minha barra de navegação

Está certo ?

//set custom background image UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"NavigationBackground.png"]]; [self.navigationBar insertSubview:backgroundView atIndex:0]; [backgroundView release]; 

Aqui está o código do link @luvieere mencionado. Cole este código no controlador rootview logo acima de @implementation rootviewController

 @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 

No iOS 5, há uma maneira oficial de fazer isso. (consulte Biblioteca de desenvolvedores do iOS )

 // someplace where you create the UINavigationController if ([navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) { UIImage *image = [UIImage imageNamed:@"NavigationBar.png"]; [navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; } 

Mas ainda assim, manter o código antigo para compatibilidade com versões anteriores, a menos que você realmente queira abandonar o iOS 4 e versões posteriores.

Seu código sozinho não fará isso, você terá que escrever uma categoria para que funcione. Existem duas abordagens em relação à maneira como você deve fazê-lo: o primeiro envolve transformar a imagem em uma UINavigationBarUINavigationBar do seu UINavigationBar e trazê-la para frente em cada um dos methods viewDidAppear UIViewController . No entanto, isso foi relatado com alguns problemas para cobrir o UIBarButtonItem correto. O outro método envolve replace

- (void)drawRect:(CGRect)rect

e desenhando a imagem lá. Ambos são amplamente abordados nesta discussão do blog .

A maneira mais fácil é apenas definir o conteúdo da camada UINavigationBar .

 NSString *barBgPath = [[NSBundle mainBundle] pathForResource:@"mybgimage" ofType:@"png"]; [nBar.layer setContents: (id)[UIImage imageWithContentsOfFile: barBgPath].CGImage]; 

A desvantagem é que os botões não são gerados com a tonalidade apropriada, mas você pode definir a cor da barra de navegação para o que estiver mais próximo da sua imagem e a matiz deve ser cuidada.

Eu faria isso no appdelegate algo como

 + (void)Generalstyle { //navigationbar UINavigationBar *navigationBar = [UINavigationBar appearance]; [navigationBar setBackgroundImage:[UIImage imageNamed:@"navigation.png"] forBarMetrics:UIBarMetricsDefault]; } 

E em

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[self class] Generalstyle]; } 

arquivo .h:

 + (void) Generalstyle; 

no ios5, defino a imagem de fundo da barra de navegação (para toda a imagem da barra de navegação) em AppDelegate.m :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO]; UIImage *navBarBackgroundImage = [UIImage imageNamed:@"nav_bg"]; [[UINavigationBar appearance] setBackgroundImage:navBarBackgroundImage forBarMetrics:UIBarMetricsDefault]; return YES; } 

Quando o iPhone 5 vem, temos que definir o tipo de dispositivo. Então use isso

 if([self.navigationController.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) { //iOS 5 new UINavigationBar custom background [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbg_ForiPhone5_Imagename.png"] forBarMetrics: UIBarMetricsDefault]; } else { [self.navigationController.navigationBar insertSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbg_ForOtherIphone_Imagename.png"]] atIndex:0]; } 

Para mais informações, acesse este link

Este funcionando bem no iOS 6 e 7

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

Versão rápida :

 let navBar = UINavigationBar.appearance(); navBar.setBackgroundImage(UIImage(named: "yourImageName"), forBarMetrics: .Default) 

Swift atualizado 3.2 :

 let navBar = UINavigationBar.appearance(); navBar.setBackgroundImage(UIImage(named: "yourImageName"), for: .default) 

Você também pode adicionar uma categoria que estenda a class UINavigationBar e replace o método drawRect: na categoria.

O que eu fiz foi apenas criar um UIImage com a imagem que eu queria e adicionado à barra de navegação como este.

 UIImage *image = [UIImage imageNamed:@"yourImage.png"]; [[UINavigationBar appearance] setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; 

Ao adicionar a imagem de fundo da barra de navegação, você deve ter muito cuidado com suas dimensões. Certifique-se de ter as seguintes dimensões para diferentes tamanhos de canvas.

1) background.png => 320 x 44
2) background@2x.png => 640×88 // usado para iPhone5 e para dispositivos de retina
3) background@3x.png => 1334×183 // usado para iPhone6

Use o código a seguir para adicionar uma imagem de plano de fundo e evitar qualquer lado a lado na imagem de plano de fundo da Barra de Navegação.

 [self.navigationController.navigationBar setBackgroundImage:[[UIImage imageNamed:@"background"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) resizingMode:UIImageResizingModeStretch] forBarMetrics:UIBarMetricsDefault]; 

Experimente este código na sua Classe AppDelegate para mostrar a imagem na barra de navegação. Vai lhe ajudar bastante.

 [[UINavigationBar appearance] setBackgroundImage:[[UIImage imageNamed:@"headerImg.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)] forBarMetrics:UIBarMetricsDefault];