2011-05-14 20 views
6

Estoy haciendo una aplicación de iPhone que permite al usuario regresar a UINavigationBar. Sin embargo, la forma en que se ve ahora es horrible. Estoy tratando de personalizarlo con mi propia imagen (menos el fondo predeterminado UIBarButtonItem). Mi imagen incluye mi fondo personalizado, pero aún puede ver parte del botón a la izquierda y a la derecha.BackButton personalizado UINavigationBar?

UIBarButtonItem *cancelButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_button_normal.png"] style:UIBarButtonItemStylePlain target:self action:@selector(cancel:)] autorelease]; 
self.navigationItem.leftBarButtonItem = cancelButton; 

¿Hay alguna manera de eliminar ese espacio? ¿Existe la posibilidad de que pueda usar un UIButton para poder personalizarlo por completo? Hice algo en el constructor de interfaces donde arrastré un UIButton al botón derecho de UINavigationBar y funciona perfectamente. ¿Hay alguna forma en que pueda hacerlo programáticamente?

Gracias!

Así es como se ve:

UINavigationBar

editar # 1:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self action:@selector(cancel:) forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Show View" forState:UIControlStateNormal]; 
[button setBackgroundImage:[UIImage imageNamed:@"back_button_normal.png"] forState:UIControlStateNormal]; 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
[self.navigationItem setLeftBarButtonItem:barButtonItem]; 

Así es como me gano la base para el UINavigationBar (lugares en mi RootViewController):

@implementation UINavigationBar (UINavigationBarCustomDraw) 

- (void) drawRect:(CGRect)rect { 

[self setTintColor:[UIColor colorWithRed:0.85f green: 0.85f blue:0.85f alpha:1]]; 

if ([self.topItem.title length] > 0 && ![self.topItem.title isEqualToString:@"Back to ..."]) { 
    [[UIImage imageNamed:@"UINavigationBar_background.png"] drawInRect:rect]; 

    CGRect frame = CGRectMake(0, 0, 320, 44); 
    UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
    [label setBackgroundColor:[UIColor clearColor]]; 
    label.font = [UIFont boldSystemFontOfSize: 20.0]; 
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:1]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    label.text = self.topItem.title; 
    self.topItem.titleView = label; 

} else { 
    [[UIImage imageNamed:@"login_button.png"] drawInRect:rect]; 
    self.topItem.titleView = [[[UIView alloc] init] autorelease]; 
} 
} 

@end 
+0

posibles duplicados: [Cómo crear backBarButtomItem con vista personalizada para un UINavigationController] (http: // stackoverflow.com/questions/526520/how-to-create-backbarbuttomitem-with-custom-view-for-a-uinavigationcontroller); [Despliegue del botón Atrás de UINavigationBar] (http://stackoverflow.com/questions/2053435/uinavigationbar-back-button-skinning); [Cómo cambiar un UIBarButtonItem en un UINavigationBar] (http://stackoverflow.com/questions/2570247); de la barra lateral ** Relacionados **. –

Respuesta

11

Si desea agregar UIButton a la navegación b ar a través de obj-c, el código debe tener este aspecto:

UIButton *button = /* initialize your button */ 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 
[self.navigationItem setLeftBarButtonItem:barButtonItem]; 
+0

'no '-button' method found' en esta línea:' UIBarButtonItem * barButtonItem = [[UIBarButtonItem alloc] button]; ' – iosfreak

+0

Lo siento, comí un trozo de código :) Editado. – akashivskyy

+0

Gracias! La acción funciona, así que sé que está allí ... Pero por alguna razón no puedo verlo ... ¿Tal vez está detrás del bar o algo así? ¿Algunas ideas? Gracias por tu ayuda. – iosfreak

2

El problema es que está utilizando en su lugar UIButtonTypeRoundedRectUIButtonTypeCustom. También puede que quiera usar:

UIImage *image = [UIImage imageNamed:@"back_button_normal.png"] 
button.frame = CGRectMake(0, 0, image.size.width, image.size.height); 
14

combinada de las dos respuestas y ha añadido la funcionalidad del botón Volver

// Custom Navigation Bar Back Button 

// Create Button 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = CGRectMake(0,0,54,32); // width=54, height=32 

// Set Button Image 
NSString *backButtonURL = [[NSBundle mainBundle]pathForResource:@"back" ofType:@"png"]; 
UIImage *backButtonImage = [UIImage imageWithContentsOfFile:backButtonURL]; 
[button setBackgroundImage:backButtonImage forState:UIControlStateNormal]; 

// Important: Set Button Action to go back 
[button addTarget:self.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];