Pregunta

Estoy agregando una imagen de fondo personalizada a mi barra de UINavigation anulando el drawRect a través de una categoría.

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

Esta solución parece funcionar bien, hasta que intenta hacer uso de la propiedad navigationitem.prompt. En lugar de hacer una animación suave de presentar el mensaje, lo hace abruptamente.

¿Hay alguna sugerencia sobre cómo remediar esto? O una forma alternativa de configurar una imagen de fondo.

PS. Estoy tratando de evitar simplemente agregar una imagen de fondo como una subvista, debido a la forma en que las cosas se reorganizan cuando las vistas se activan. Y no me gustaría enviar SubviewToBack en cada vista viewDidAppear.

TIA!

EDITAR: También probé el método swizzling, que funcionaría bien si pudiera dejar que mi imagen se estire, pero como la imagen no es estirable, tengo que descubrir cómo aprovechar la animación que hace un cambio. en lugar de un estiramiento.

EDITAR: vea mi respuesta hacky a continuación

¿Fue útil?

Solución

Muy "hacky", pero esto es lo más cerca que puedo de hacer lo que quiero ...

Básicamente, cuando el método se arremolina, dejar que la imagen se estire no funcionó bien porque también tenía esquinas redondeadas. Así que en lugar de eso, hice las esquinas con un img transparente separado y lo agregué como una subvista para que no se vieran afectados por la animación de estiramiento.

Así que mi categoría ahora se ve así ...

#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 más información sobre el método swizzling ... http://www.cocoadev.com/index .pl? MethodSwizzling y Método Swizzle en el dispositivo iPhone

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top