2009-09-04 16 views
6

He aplicado el siguiente código a mi aplicación para cambiar la imagen de la barra de navegación.Fondo de la barra de NAVEGACIÓN en iPhone

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
[self.navigationController.navigationBar setTintColor:[UIColor blackColor]]; 
[self setNavigationBarTitle]; 
} 
-(void)setNavigationBarTitle { 
UIView *aViewForTitle=[[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 45)] autorelease]; 
UIImageView *aImg=[[UIImageView alloc] initWithFrame:CGRectMake(-8, 0, 320, 45)]; 
aImg.image=[UIImage imageNamed:@"MyTabBG.png"]; 
[aViewForTitle addSubview:aImg]; [aImg release]; 
UILabel *lbl=[[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 305, 45)] autorelease]; 
lbl.backgroundColor=[UIColor clearColor]; lbl.font=[UIFont fontWithName:@"Trebuchet MS" size:22]; 
lbl.shadowColor=[UIColor blackColor]; [lbl setShadowOffset:CGSizeMake(1,1)]; 
lbl.textAlignment=UITextAlignmentCenter; lbl.textColor=[UIColor whiteColor]; [email protected]"Mobile Tennis Coach Overview"; 
[aViewForTitle addSubview:lbl]; 
[self.navigationItem.titleView addSubview:aViewForTitle]; 
} 

Ver imágenes siguientes. Puedes ver el problema que estoy enfrentando.

alt text


alt text

Cada controlador de vista de mi solicitud tiene por encima de los métodos para configurar el fondo de la barra de navegación.

Sin embargo, cuando paso un nuevo controlador de vista a mi aplicación. El botón Atrás aparecerá.

Necesito el botón Atrás para que aparezca. Pero la imagen debe estar detrás del botón Atrás.

Ahora estoy un poco confundido aquí.

¿Me puede ayudar con esto?

Gracias de antemano por compartir su conocimiento conmigo.

Muchas gracias.

+0

Hola Sagar, ¿cómo hacen un botón normal (es decir, no un botón de retroceso)? ¿Funciona bien o también tiene el mismo problema? – h4xxr

+0

en mi controlador de navegación anterior - la vista desaparecerá del método - he configurado el título como nuevo - self.navigationItem.title = @ "volver". –

Respuesta

6

Después de una noche molesto, me encontré con una ligera inclinación a esto, si se utiliza drawLayer. Con drawRect, cuando reproduce un video o video de youtube, la barra de navegación se reemplaza con la imagen. Y leí algunas publicaciones que hicieron que su aplicación fuera rechazada.

@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 

Si este artículo es exacta, todo debe estar bien con este enfoque: http://developer.apple.com/iphone/library/qa/qa2009/qa1637.html

5

La respuesta corta es que Apple no admite la modificación de la estructura de UINavigationBar. Realmente no quieren que hagas lo que intentas hacer. Eso es lo que está causando el problema que estás viendo.

Por favor presente un radar solicitando esta función para que pueda obtener la atención suficiente como para ser oficialmente agregado en algún momento.

Dicho esto, para resolver el problema puede agregar una categoría a UINavigationBar con un método -drawRect: y dibujar la imagen de fondo en ese método. Algo como esto funcionará:

- (void)drawRect:(CGRect)rect 
{ 
    static UIImage *image; 
    if (!image) { 
    image = [UIImage imageNamed: @"HeaderBackground.png"]; 
    if (!image) image = [UIImage imageNamed:@"DefaultHeader.png"]; 
    } 
    if (!image) return; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); 
} 
Cuestiones relacionadas