Pergunta

Eu estou adicionando uma imagem de fundo personalizada para o meu UINavigationBar, substituindo o drawRect via uma categoria.

- ( void )drawRect:( CGRect )rect{
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )];
}

Esta solução parece funcionar bem, até que você tente fazer uso de propriedade navigationitem.prompt. Em vez de fazer uma animação suave de apresentar o prompt, ele faz isso de forma abrupta.

Existem quaisquer sugestões sobre como resolver isso? Ou uma forma alternativa de definir uma imagem de fundo.

PS. Eu estou tentando evitar apenas adicionando uma imagem de fundo como uma subexibição por causa da maneira como as coisas reorganizar quando vistas push / pop. E eu odiaria sendSubviewToBack em viewDidAppear de cada vista.

TIA!

EDIT: Eu também tentei método swizzling, que iria funcionar bem se eu poderia apenas deixar a minha imagem trecho, mas desde que a imagem não é extensível, eu preciso descobrir como explorar a animação que acontece para fazer uma mudança em vez de um estiramento.

EDIT: ver a minha resposta hacky abaixo

Foi útil?

Solução

Assim, muito "hacky", mas este é o mais próximo que eu posso começar a fazer o que eu quero ...

cantos arredondados Basicamente quando o método swizzling, simplesmente deixar o trecho imagem não estava funcionando bem para mim, porque eu também tinha. Então, ao invés eu fiz os cantos um img transparente separada e adicioná-lo como um subview para que não ficar afectado pela animação trecho.

Assim, a minha categoria agora se parece com isso ..

#import "UINavigationBar+custom.h"

#define cornersTag 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 if(!corners){
  UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0];
  corners = [[[UIImageView alloc] initWithImage:img] autorelease];
  corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height);
  corners.tag = cornersTag;
  [self addSubview:corners];
 }
}

- (void)customDrawRect:( CGRect )rect{
 [self customDrawRect:rect];
 [[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; 
 [self setCornersIfNeeded];
}

@end

Para saber mais sobre swizzling método ... http://www.cocoadev.com/index .pl? MethodSwizzling e

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