UIBarButtonItem con color?

¿Es posible tener un UIBarButtonItem rojo?

Si alguien está buscando un código para 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

¿Por qué no solo?

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

(en sdk 4. *, ios 5 y más)

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]; 

Puede establecer la propiedad tintColor de un UIBarButtonItem en iOS 5. Si necesita admitir iOS 4, consulte esta publicación de blog . Detalla el uso de un UISegmentedControl diseñado para que parezca un solo botón.

Usar una imagen personalizada no funciona, ya que solo usa el alfa para renderizar el botón.

Bueno, en realidad, hay una solución mucho mejor para esto, en mi opinión, que implica menos código y usa los controles de IU nativos.

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 usó la técnica para crear una categoría de UIBarButtonItem que funciona de manera shiny:

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

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.

Si es el UIBarButtonItem de una UIToolbar

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

 @class UIToolbarTextButton; 

Luego cambie los botones de la barra de herramientas haciendo esto:

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

Si usa IB (Interface Builder), arrastre un UIView desde la Biblioteca hacia la UIToolBar , y generará un UIBarButtonItem con una vista personalizada. A continuación, puede agregar cualquier otro control que desee, por ejemplo, UILabel , UIActivityIndicatorView , UIActivityIndicatorView .

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 ‘objective’ 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é alrededor de esto agregando 2 propiedades a mi subclase (usando ARC):

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

Luego, en el inicio de su subclase, agregue algo como esto al código de respuesta aceptado:

 [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 de vista principal que hospeda todo esto, en el ‘viewDidLoad’, agregue esto:

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

Espero que esto ayude a otros a ahorrar tiempo cuando comiencen por este camino con Storyboards / iOS5

Cuando tienes la configuración de UIBarButtonItem en un guión gráfico , debes establecer tintColor en el viewWillAppear() o viewDidAppear() (ponerlo 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: probado en iOS 8/9 .