2008-12-19 34 views
7

Estoy agregando un fondo personalizado para mi UINavigationBar. Funciona bien siempre que el teléfono esté en modo vertical. Tan pronto como cambio al modo horizontal, la mitad de la barra aparece en azul (el color predeterminado de la barra de navegación) y la mitad tiene mi imagenFondo personalizado para UINavigationBar en modo horizontal

¿Cómo puedo estirar la imagen para el modo horizontal y volverla a hacer pequeña para el modo vertical?

Gracias

Solución
En caso que alguien está buscando una respuesta a cómo añadir una imagen a la barra de navegación - aquí va

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]; 
+0

Tuve que cambiar esa segunda línea a: [imgView setImage: [UIImage imageNamed: @ "navbar.png"]]; ... en caso de que alguien tenga problemas con noshow. – maralbjo

+0

Gracias, uhm, la publicación es un poco vieja, de todos modos ... ¿qué hay de cambiar la altura de la barra de navegación? ¿Debería subclasificarlo en ese caso? – aneuryzm

Respuesta

3

Es probable que tenga que ajustar la autoresizingMask de su vista de la imagen de fondo; intente usar UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

1

La solución que Ben dio solucionó el problema, pero amplía la imagen en modo horizontal. Terminé creando dos imágenes, una para paisaje y otra para el modo retrato. Luego añade código en shouldAutoRotate a cambiar la imagen de barra de navegación basada en la orientación

6

En ambos modos de orientación de la pantalla es mucho mejor usar

[navigationController.navigationBar insertSubview:imgView atIndex:0]; 

Esto pone a la vista de la imagen en todos los otros puntos de vista y toda la barra de navegación por defecto los elementos (título, botones estándar) funcionan bien.

6

Después de un poco de investigación y seguimiento y error, encontré un problema, que no reemplazará a la barra de navegación cuando ingrese al modo de reproducción de películas. Hopeefully esto no causa problemas con la aprobación de aplicaciones, pero en base a este post, creo que debería estar bien:

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 
0

intente el método más simple de [UIImage imageNamed:@"navbar_landscape.png"] ya que un elemento de interfaz de usuario es exactamente lo imageNamed : es para, como muestra ljonesATL.

1

Puede cambiar la imagen de las dos orientaciones vertical y horizontal mediante el suministro de diferentes imágenes para diferentes orientaciones comprobando el tamaño del marco de esa instancia de la barra 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); 
} 

Y this complete demo Xcode project en la personalización de la apariencia de UINavigationBar podría ser servicial. También incluye versiones @ 2x de imágenes de fondo para admitir pantallas Retina en dispositivos iPhone 4.

+1

Esta es, por mucho, la mejor solución más completa que he visto y su proyecto de ejemplo en github es excelente. ** Gracias. ** Animo a todos a votar esto. – memmons

+0

Muchas gracias. Me alegra que lo encuentres útil. –

Cuestiones relacionadas