fundo personalizado para UINavigationBar no modo paisagem
-
22-08-2019 - |
Pergunta
Estou adicionando um fundo personalizado para o meu UINavigationBar. Ele funciona muito bem, desde que o telefone está no modo retrato. Assim que eu mudar para o modo paisagem, metade do bar parece azul (a cor barra de navegação padrão) e metade dos que tem a minha imagem
Como posso esticar a imagem para o modo paisagem e torná-la pequena novamente para o modo retrato?
Graças
Solução
ninguém Incase está à procura de uma resposta para como adicionar uma imagem a barra de navegação - aqui vai
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 480.0, 44.0)];
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"navbar_landscape" ofType:@"png"]]];
[navigationController.navigationBar addSubview:imgView];
[imgView release];
Solução
Você provavelmente precisará definir o autoresizingMask do seu background image vista; tente usar UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
Outras dicas
Em ambos os modos de orientação da tela é muito melhor para uso
[navigationController.navigationBar insertSubview:imgView atIndex:0];
Este ponto de vista de imagem coloca sob todos os outros pontos de vista e todos os elementos da barra de navegação padrão (título, botões padrão) trabalho OK.
Depois de um pouco de pesquisa e tentativa e erro, eu encontrei um trabalho em torno, que não vai substituir a barra de navegação quando você entra no modo de reprodução. Hopeefully isso não causa problemas com a aprovação aplicativo, mas com base neste post, eu acho que ele deve estar bem:
http://developer.apple.com/iphone/library /qa/qa2009/qa1637.html
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
if([self isMemberOfClass: [UINavigationBar class]]){
UIImage *image = [UIImage imageNamed:@"navBarBackground.png"];
CGContextClip(ctx);
CGContextTranslateCTM(ctx, 0, image.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextDrawImage(ctx, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}else{
[super drawLayer:layer inContext:ctx];
}
}
@end
A solução Ben deu conseguiu resolver o problema, mas se estende a imagem no modo paisagem. I acabou criando duas uma imagens-para a paisagem e outro para o modo retrato. Eu adicionei então o código em shouldAutoRotate para mudar a imagem barra de navegação com base na orientação
Você pode alterar a imagem para ambas as orientações retrato e paisagem, fornecendo imagens diferentes para diferentes orientações, verificando o tamanho do quadro dessa instância bar UINavigation:
- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
return;
}
UIImage *image = (self.frame.size.width > 320) ?
[UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
CGContextClip(context);
CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}
este Xcode demonstração completa projetar sobre como personalizar a aparência de UINavigationBar pode ser útil. Ele também inclui @ 2x versões de imagens de fundo para apoio telas Retina no iPhone 4 dispositivos.
Tente o método mais simples de [UIImage imageNamed:@"navbar_landscape.png"]
desde um elemento de interface do usuário é exatamente o que imageNamed:. destina-se, como mostra ljonesATL