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];
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top