2010-09-30 35 views
7

Tengo una aplicación de barra de pestañas. y en una de las barras de pestañas tengo un controlador de navegación. Im tratando de configurar un UIButton con una imagen como el botón derecho de la barra de navegación.UIBulton como botón UINavigationbar

UIButton *refreshButton = [[UIButton alloc] init]; 
    [refreshButton setImage:[UIImage imageNamed:@"refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refreshSection) forControlEvents:UIControlEventTouchUpInside]; 
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:refreshButton]; 
    //[rightButton setImage:[UIImage imageNamed:@"refresh_icon.png"]]; << DOESN'T WORK EITHER 
    self.navigationItem.rightBarButtonItem = rightButton; 
    [refreshButton release]; 
    [rightButton release]; 

pero la imagen no aparece. Obtengo un botón invisible

EDIT: Quiero que el estilo del botón sea plano o el fondo sea transparente, de modo que solo la imagen muestre. Por lo tanto, estoy usando un botón UI en lugar de usar un UIBarButton directamente.

Respuesta

22

No tiene que crear un UIButton y usarlo como vista personalizada en el UIBarButtonItem. Se puede crear un UIBarButtonItem directamente con una imagen:

UIImage *myImage = [UIImage imageNamed:@"myImage.png"]; 
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStyleBordered target:self action:@selector(refreshSection)]; 
self.navigationItem.rightBarButtonItem = button;  
[button release]; 

-

Actualizado, de acuerdo con los comentarios

Utilice un UIImageView como vista personalizada en el UIBarButtonItem:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]]; 
UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:imageView]; 
self.navigationItem.rightBarButtonItem = rightButton; 
[imageView release]; 
[rightButton release]; 

-

Actualizado

Probamos el último enfoque y si bien esto tiene un aspecto visual como usted quiere que, me parece que no puede conseguir que le permite manejar los grifos. Aunque el objetivo y la acción se han establecido.

-

actualización final

que he recibido su código inicial en la cuestión de hasta & ejecución. El motivo por el que la imagen no se muestra es porque no ha configurado el marco del botón. Una vez que configura el marco, la imagen se muestra en la barra de navegación.

Aquí es mi fragmento Solía ​​& probado:

UIImage *myImage = [UIImage imageNamed:@"paw.png"]; 
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[myButton setImage:myImage forState:UIControlStateNormal]; 
myButton.showsTouchWhenHighlighted = YES; 
myButton.frame = CGRectMake(0.0, 0.0, myImage.size.width, myImage.size.height); 

[myButton addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithCustomView:myButton]; 
self.navigationItem.rightBarButtonItem = rightButton; 

[rightButton release]; 
[myButton release]; 

Nota: He establecer la propiedad showsTouchWhenHighlighted del UIButton visualmente hightlight el botón cuando se presiona.

+0

Lo que quiero es que el estilo del botón sea plano o el fondo transparente. UIBarButtonItemStyleBordered o cualquier otra cosa pone la imagen en una caja. Es por eso que estaba usando un uibutton – Rupert

+0

Debería haber mencionado eso en su pregunta. Agregar un botón a la barra de navegación como lo mostré siempre lo mostrará con el borde, incluso si lo configura al estilo simple, como señaló. Creo que incluso se menciona en la documentación. –

+0

Ahora muestra la imagen pero no ocurre nada cuando hago clic en ella.He intentado [rightButton setTarget: self]; [rightButton setAction: @selector (refresh :)]; – Rupert

1

que terminé haciendo este

UIButton *refreshButton = [[UIButton alloc] initWithFrame:CGRectMake(292, 9, 27, 27)]; 
    [refreshButton setImage:[UIImage imageNamed:@"refresh_icon.png"] forState:UIControlStateNormal]; 
    [refreshButton addTarget:self action:@selector(refresh) forControlEvents:UIControlEventTouchUpInside]; 
    [self.navigationController.navigationBar addSubview:refreshButton]; 
    [refreshButton release]; 

Funciona bien ahora pero no estoy realmente seguro de si esta es la forma correcta de hacerlo.

+0

Si bien esto podría funcionar, creo que es más limpio utilizar un 'UIBarButtonItem'. –