Pregunta

Estoy añadiendo un fondo personalizado para mi UINavigationBar. Funciona bien siempre y cuando el teléfono está en el modo de retrato. Tan pronto como me cambio a modo de paisaje, la mitad de la barra aparece de color azul (el color barra de navegación por defecto) y la otra mitad tiene mi imagen

¿Cómo se puede estirar la imagen que para el modo de paisaje y que sea pequeño otra vez para el modo de retrato?

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

Solución

Es probable que tenga que ajustar la autoresizingMask de sus antecedentes vista de la imagen; trate de usar UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight

Otros consejos

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 todos los elementos de la barra de navegación por defecto (título, botones estándar) funciona bien.

Después de un poco de investigación y de prueba y error, he encontrado una solución alternativa, que no va a sustituir a la barra de navegación al entrar en el 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

La solución Ben dio solucionó el problema, pero se estira la imagen en modo horizontal. Terminé la creación de dos uno imágenes- para el paisaje y la otra para el modo de retrato. Luego añade código en shouldAutoRotate para cambiar la imagen barra de navegación basado en la orientación

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);
}

este Xcode demostración completa proyecto sobre la personalización de la apariencia de UINavigationBar podría ser útil. También incluye @ 2x versiones de imágenes de fondo de apoyo a las pantallas de retina en el iPhone 4 dispositivos.

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

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