2011-01-30 24 views
7

Estoy tratando de utilizar un elemento personalizado para el botón Atrás en la barra de navegación.iphone - UIBarButtonItem personalizado para el botón Atrás

UIImage *backButtonImage = [UIImage imageNamed:@"backbutton.png"]; 
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
[self.navigationItem setBackBarButtonItem: customItem]; 
[customItem release]; 

Lo que termino obteniendo es mi imagen con un borde alrededor. Parece que este (Mi imagen es el botón de retroceso):

Back Button

¿Cómo puedo deshacerme de la frontera? ¿Qué estoy haciendo mal?

Respuesta

9

Su imagen aparece dentro de un botón de retroceso y aparentemente (de su captura de pantalla) no es del mismo tamaño que el botón Atrás.

Es posible que desee ocultar el botón Atrás y luego reemplazarlo con un "Botón de barra izquierda" en su lugar.

Código:

UIImage *backButtonImage = [UIImage imageNamed:@"backbutton.png"]; 
UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithImage:backButtonImage style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)]; 
[self.navigationController setHidesBackButton:YES]; 
[self.navigationItem setLeftBarButtonItem: customItem]; 
[customItem release]; 
+0

Gracias por su respuesta. Intenté diferentes tamaños de imagen, pero ninguno de ellos funciona. Siempre obtengo un borde alrededor de mi imagen escalada. Algo similar sucede si utilizo LeftBarButtonItem en lugar de BackBarButtonItem. ¿Conoces algún proyecto de ejemplo que incluya imágenes y código de trabajo? – Denny

+0

No, no tengo conocimiento de ningún proyecto, pero puedo tratar de reunirlo más tarde, esta noche. – Moshe

6

Aquí está una versión actualizada. Esto incluye la configuración del objetivo, el tamaño de fuente, etc.

Además, refleja que setHidesBackButton no está disponible como una propiedad de navigationController.

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *backButtonBackgroundImg = [UIImage imageNamed:@"BackButton.png"]; 
backButton.frame = CGRectMake(0.0f, 0.0f, backButtonBackgroundImg.size.width, backButtonBackgroundImg.size.height); 
[backButton setBackgroundImage:backButtonBackgroundImg forState:UIControlStateNormal]; 
[backButton addTarget:self action:@selector(didTouchUpInsideBackButton:) forControlEvents:UIControlEventTouchUpInside]; 
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont smallSystemFontSize]]; 
[backButton setTitle:@"MyTitle" forState:UIControlStateNormal]; 

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

Tenga en cuenta que esto es de un proyecto ARC, por lo que no hay versiones, etc. en los objetos.

+1

Muchas gracias. Esto es exactamente lo que necesitaba, que no pude encontrar en otro lugar. – James

1

Creé una categoría de UINavigationBar que llamé en viewWillAppear en cada uno de mis viewControllers. El código que utilizo para cambiar la apariencia de mi botón de retroceso es el siguiente:

UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(your button frame)]; 
[backButton setBackgroundImage:[UIImage imageNamed:@"your image name"] forState:UIControlStateNormal]; 
UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView: backButton]; 
[backButton addTarget:delegate action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 
self.topItem.leftBarButtonItem = barBackButtonItem; 
self.topItem.hidesBackButton = YES; 

funciona perfectamente bajo iOS 6.

10

Sobre la base de código de Jorge, esta es mi solución.

que crear una categoría simple en UIViewController:

UIViewController + ImageBackButton.h

#import <UIKit/UIKit.h> 

@interface UIViewController (ImageBackButton) 

- (void)setUpImageBackButton; 

@end 

UIViewController + ImageBackButton.m

#import "UIViewController+ImageBackButton.h" 

@implementation UIViewController (ImageBackButton) 

- (void)setUpImageBackButton 
{ 
    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 34, 26)]; 
    [backButton setBackgroundImage:[UIImage imageNamed:@"back_arrow.png"] forState:UIControlStateNormal]; 
    UIBarButtonItem *barBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 
    [backButton addTarget:self action:@selector(popCurrentViewController) forControlEvents:UIControlEventTouchUpInside]; 
    self.navigationItem.leftBarButtonItem = barBackButtonItem; 
    self.navigationItem.hidesBackButton = YES; 
} 

- (void)popCurrentViewController 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

@end 

Ahora todo lo que tiene que hacer es #import UIViewController+ImageBackButton.h en cualquiera de sus v controladores iew o en una clase de controlador de vista base personalizado que sus otros controladores de vista heredan de e implementan el método viewWillAppear::

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self setUpImageBackButton]; 
} 

eso es todo. Ahora tiene un botón de retroceso de imagen en todas partes. Sin un borde ¡Disfrutar!

+1

Gracias hombre ... Usted ha ahorrado mi tiempo –

+1

Esta es una buena solución. Me pregunto si existe una forma de detectar dinámicamente cuándo está en pantalla el botón de retroceso estándar para evitar tener que anular la visualización de Mostrar siempre cada vez. –

+0

@IvanLesko Esa es una buena pregunta. Estoy seguro de que debe haber una manera. Si está desesperado y todo lo demás falla, puede repetir las subvistas de UINavigationBar. Pero ese debería ser el último recurso :) –

Cuestiones relacionadas