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 UINavigationBar
– UINavigationBar
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];