É possível ter um UIBarButtonItem vermelho?
Se alguém estiver procurando por código para duplicar exatamente um UIBarButtonItem simples:
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];
E delete.png é:
Por que não apenas:
[[self editButtonItem] setTintColor:[UIColor redColor]];
(no sdk 4. *, ios 5 e acima)
Você pode criar um UIButton personalizado com sua aparência desejada e inicializar seu UIBarButtonItem com ele como uma exibição personalizada.
UIButton *button = [UIButton buttonWithType:....]; ...(customize your button)... UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:button];
Você pode definir a propriedade tintColor de um UIBarButtonItem no iOS 5. Se você precisar dar suporte ao iOS 4, confira esta postagem no blog . Ele detalha usando um estilo UISegmentedControl para parecer um único botão.
Usar uma imagem personalizada não funciona, pois usa apenas o alfa para renderizar o botão.
Ok, há realmente uma solução muito melhor para isso, na minha opinião, que envolve menos código e usa os controles de interface do usuário nativos.
O truque é usar um UISegmentedControl e remover todos os segmentos, exceto um. (Não pode ser feito no IB, tem que ser feito de forma programática).
Depois de fazer isso, defina a cor da tonalidade e crie um UIBarButtonItem passando o UISegmentedControl como uma exibição personalizada.
Esse cara usou a técnica para criar uma categoria de UIBarButtonItem que funciona de forma shiny:
http://fredandrandall.com/blog/2011/03/31/how-to-change-the-color-of-a-ibaribarutem/
Você pode criar uma imagem personalizada para o botão e usá-la. Senão, se você definiu a tonalidade Cor da sua barra de navegação ou barra de ferramentas para vermelho, os itens dos botões também aparecerão vermelhos.
Se for o UIBarButtonItem de um UIToolbar
definir isso antes de sua implementação no arquivo que você deseja que este código
@class UIToolbarTextButton;
Em seguida, altere os botões da barra de ferramentas fazendo isso:
for (UIView *view in self.navigationController.toolbar.subviews) { NSLog(@"%@", [[view class] description]); if ([[[view class] description] isEqualToString:@"UIToolbarTextButton"]) { [(UIToolbarTextButton *)view setTintColor:yourcolor]; } }
Se estiver usando o IB (Interface Builder), arraste um UIView
da Biblioteca para o UIToolBar
e ele gerará um UIBarButtonItem
com uma visualização customizada. Você pode então adicionar quaisquer outros controles que desejar, por exemplo, UIButton
, UILabel
, UIActivityIndicatorView
.
Eu queria adicionar algo à solução realçada. Se você fizer essa subclass, ele não executará seguidos e seletores desafiados pelo storyboard que são atribuídos ao UIBarButtonItem. Além disso, as propriedades ‘target’ e ‘action’ não são configuradas no UIBarButtonItem, portanto você não pode acessá-las a partir da subclass e atribuí-las ao seu UIButton.
Eu trabalhei em torno disso adicionando 2 propriedades à minha subclass (usando ARC):
@property (nonatomic, weak) id targetViewController; @property (nonatomic, strong) NSString *segueIdentifier;
Em seguida, no init de sua subclass, adicione algo assim ao código de resposta aceito:
[button addTarget:self action:@selector(performAction) forControlEvents:UIControlEventTouchUpInside];
e uma function:
- (void)performAction { if (_targetViewController && _segueIdentifier) { [_targetViewController performSegueWithIdentifier:_segueIdentifier sender:self]; } else { NSLog(@"Requires targetViewController and segueIdentifier to be set"); } }
finalmente, no seu controlador de visualização principal que está hospedando tudo isso, no ‘viewDidLoad’, adicione isto:
_fancyBarButtonItem.segueIdentifier = @"NewTransaction"; _fancyBarButtonItem.targetViewController = self;
Espero que isso ajude alguém a economizar tempo ao iniciar esse caminho com Storyboards / iOS5
Quando você tem a configuração UIBarButtonItem em um Storyboard , você precisa configurar o tintColor no método viewWillAppear()
ou viewDidAppear()
(colocando-o em viewDidLoad () não funciona para mim …):
- (void)viewWillAppear { [super viewWillAppear]; [[self editButtonItem] setTintColor:[UIColor redColor]]; }
Ou em Swift:
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) editButtonItem.tintColor = UIColor.redColor() }
Nota: testado no iOS 8/9 .