Pregunta

Logré agregar un fondo personalizado a mi barra de navegación usando:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

Esto funciona bien y puedo ver bien el título y los botones. Sin embargo, cuando profundizo un nivel y luego vuelvo a la raíz, los botones están ocultos, pero el título aún está visible. Parece que la imagen de la barra de navegación cubre los elementos del botón.

Estoy confundido ya que lo estoy insertando en la parte inferior, por lo que supongo que cuando los elementos de navegación se presionan y aparecen, se muestran sobre otras vistas en la barra de navegación.

¿Alguna idea?

Gracias,

Mike

¿Fue útil?

Solución

Siguiendo la descripción de aquí , sugiero agregar una categoría a la barra de navegación.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end

Otros consejos

En iOS 5 esto no funcionará, pero la buena noticia es que hay una manera simple de hacerlo

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

NOTA: Esto solo funcionará en iOS 5 y superior, así que asegúrese de verificar la versión de iOS si desea ser compatible con versiones anteriores.

Las subvistas de NavigationBar cambian constantemente, es decir, cada vista aparece / desaparece, por lo que no debe esperar tener la vista de imagen agregada en el índice 0 de la matriz de subvistas.

Puede intentar agregar esto en viewDidAppear (en cada controlador de vista que administra elementos de navegación / :):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

He usado la solución Hauek pero cuando la barra tiene un sabor diferente en otros controladores, podría dar algunos problemas menores, de todos modos, esta no es la mejor opción.

Espero que ayude, al menos entender por qué lo que estabas haciendo no funcionaba

En lugar de hacerlo en drawRect: puede anular el método drawLayer: inContext: en una clase de categoría UINavigationBar. Dentro del método drawLayer: inContext: , puede dibujar la imagen de fondo que desea usar. También puede elegir diferentes imágenes para orientaciones de interfaz vertical y horizontal si su aplicación admite múltiples orientaciones de interfaz.

- (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 proyecto completo de demostración de Xcode sobre la personalización de la apariencia de UINavigationBar también podría ser útil.

La forma en que simplemente puede agregar un nuevo fondo a su UINavigationBar es la siguiente.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top