2009-03-20 14 views

Respuesta

62

Si alguien está buscando para el código de duplicar exactamente un UIBarButtonItem simple:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setBackgroundImage:[UIImage imageNamed:@"delete.png"] forState:UIControlStateNormal]; 
[button setTitle:@"Delete" forState:UIControlStateNormal]; 
button.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0f]; 
[button.layer setCornerRadius:4.0f]; 
[button.layer setMasksToBounds:YES]; 
[button.layer setBorderWidth:1.0f]; 
[button.layer setBorderColor: [[UIColor grayColor] CGColor]]; 
button.frame=CGRectMake(0.0, 100.0, 60.0, 30.0); 
[button addTarget:self action:@selector(batchDelete) forControlEvents:UIControlEventTouchUpInside]; 

UIBarButtonItem* deleteItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

Y delete.png es:

delete.png

+8

Una nota adicional: necesita agregar la biblioteca QuartzCore a su proyecto e importarla en su clase para usar los métodos CALayer. – Johanisma

+6

Para evitar que otros tengan que buscarlo: # import

+2

Creo que el radio de esquina predeterminado podría ser 5.0f en lugar de 4.0f. Además, las personas también pueden preferir usar una imagen de 1 píxel de ancho para mantener la imagen pequeña. Esta publicación fue útil, ¡gracias! –

1

Puede crear una imagen personalizada para el botón y usar eso. De lo contrario, si ha configurado el tintColor de su barra de navegación o barra de herramientas en rojo, los elementos del botón en estos también aparecerán en rojo.

3

El uso de una imagen personalizada no funciona, ya que solo utiliza el alfa para procesar el botón.

26

Puede crear UIButton personalizado con el aspecto deseado e inicializar su UIBarButtonItem con él como una vista personalizada.

UIButton *button = [UIButton buttonWithType:....]; 
...(customize your button)... 

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button]; 
+1

Pero esto no le da un UIBarButtonItem que coincida con el renderizado predeterminado de iOS, a menos que esté dispuesto a replicar cuidadosamente el comportamiento de renderización predeterminado de iOS como lo hace Scott. Sin embargo, si desea salir del aspecto predeterminado, este es claramente el camino a seguir. – charshep

0

Si se utiliza IB (Interface Builder), arrastre un UIView de la biblioteca a la UIToolBar, y generará un UIBarButtonItem con una vista personalizada. Luego puede agregar cualquier otro control que desee, p. UIButton, UILabel, UIActivityIndicatorView.

1

Si su UIBarButtonItem la de un UIToolbar

configurar esto antes de su implementación en el archivo que desea este código

@class UIToolbarTextButton; 

A continuación, cambiar los botones de la barra de herramientas que hacen esto:

for (UIView *view in self.navigationController.toolbar.subviews) { 
     NSLog(@"%@", [[view class] description]); 
     if ([[[view class] description] isEqualToString:@"UIToolbarTextButton"]) { 
      [(UIToolbarTextButton *)view setTintColor:yourcolor]; 
     } 
    } 
2

bien, en realidad hay una solución mucho mejor que esto, en mi opinión, lo que implica menos código y utiliza los controles de interfaz de usuario nativa.

El truco es usar un UISegmentedControl, y eliminar todos los segmentos excepto uno. (No se puede hacer en IB, tiene que hacerse programáticamente).

Una vez que haya hecho eso, establezca el color del tinte, luego cree un UIBarButtonItem pasando el UISegmentedControl como una vista personalizada.

Este tipo se utiliza la técnica de crear una categoría de UIBarButtonItem la que trabaja de forma excelente:

http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-uibarbuttonitem/

+0

Excelente sugerencia si tiene que soportar 4.3 como lo hago. Voy con la categoría como se detalla en el enlace. –

7

Usted puede establecer la propiedad tintColor de un UIBarButtonItem en iOS 5. Si tiene que apoyar a iOS 4, cheque fuera this blog post. Detalla el uso de un UISegmentedControl diseñado para que parezca un solo botón.

0

Quería agregar algo a la solución resaltada. Si realiza esta subclasificación, no ejecutará los segmentos y selectores definidos como guiones gráficos que están asignados al UIBarButtonItem. Además, las propiedades 'objetivo' y 'acción' no están establecidas en el UIBarButtonItem, por lo que no puede acceder a ellas desde la subclase y asignarlas a su UIButton.

trabajé en torno a este mediante la adición de 2 propiedades a mi subclase (usando ARC):

@property (nonatomic, weak) id targetViewController; 
@property (nonatomic, strong) NSString *segueIdentifier; 

A continuación, en el inicio de su subclase, añadir algo como esto para el código de respuesta aceptada:

[button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside]; 

y una función:

- (void)performAction { 
    if (_targetViewController && _segueIdentifier) { 
     [_targetViewController performSegueWithIdentifier:_segueIdentifier sender:self]; 
    } else { 
     NSLog(@"Requires targetViewController and segueIdentifier to be set"); 
    } 
} 

, finalmente, en su controlador principal opinión de que es de alojamiento de todo esto, en el 'viewDidLoad', añadir lo siguiente:

_fancyBarButtonItem.segueIdentifier = @"NewTransaction"; 
_fancyBarButtonItem.targetViewController = self; 

Espero que esto ayude a alguien a ahorrar tiempo cuando empiezan por este camino con guiones gráficos/IOS5

36

¿Por qué no:

[[self editButtonItem] setTintColor:[UIColor redColor]]; 

(el SDK 4. *, iOS 5 en adelante)

+0

genial. Esto es perfecto. – Viraj

+0

Gracias. es muy fácil – iMeMyself

+0

Justo lo que se necesitaba. Gracias. – jkcl

0

Cuando se ha configurado en un UIBarButtonItem Storyboard, hay que establecer el tintColor en el método viewWillAppear() o viewDidAppear() (poniéndolo en viewDidLoad() no funciona para mí ...):

- (void)viewWillAppear { 
    [super viewWillAppear]; 
    [[self editButtonItem] setTintColor:[UIColor redColor]]; 
} 

O en Swift:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    editButtonItem.tintColor = UIColor.redColor() 
} 

Nota: probados en iOS 8/9.

Cuestiones relacionadas