Quero criar um UIBarButtonItem com uma imagem personalizada, mas não quero a borda que o iPhone adiciona, pois minha imagem tem uma borda especial.
É o mesmo que o botão Voltar, mas é um botão Avançar.
Este aplicativo é para um projeto interno, então não me importo se a Apple o rejeitar, aprovar ou gostar :-)
Se eu usar a propriedade initWithCustomView: v do UIBarButtonItem, posso fazer isso:
UIImage *image = [UIImage imageNamed:@"right.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted];
button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);
[button addTarget:self action:@selector(AcceptData) forControlEvents:UIControlEventTouchUpInside];
UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ];
[v addSubview:button];
UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v];
self.navigationItem.rightBarButtonItem= forward;
[v release];
[image release];
Isso funciona, mas se eu tiver que repetir esse processo em 10 visualizações, isso não é DRY.
Suponho que tenho que fazer uma subclasse, mas o quê?
- NSView?
- UIBarButtonItem?
obrigado,
Saudações,
ios
iphone
uibarbuttonitem
Mongeta
fonte
fonte
Respostas:
Você pode adicionar um método a UIBarButtonItem sem subclassificá-lo usando a categoria personalizada:
Portanto, em qualquer lugar do seu código, você pode criar um item de barra chamando esse método (desde que inclua um cabeçalho com sua declaração).
PS Você não precisa usar 'v' UIView, pois pode criar
UIBarButtonItem
com um botão como visualização personalizada diretamente.PPS Você também precisa de [liberação direta] em seu código.
fonte
Outra solução simples é
fonte
Eu achei isso fácil. É sugerido no topo. "random.png" deve estar no projeto. Basta arrastar e soltar qualquer imagem.
fonte
Uma alternativa é a subclasse UIBarButtonItem. Por quê? Para que a ação seja invocada no destino com o remetente correto. No código acima, o argumento do remetente na mensagem de ação é a instância UIButton, não a instância UIBarButtonItem. Isso seria importante, por exemplo, se você deseja apresentar um UIPopoverController a partir do item do botão da barra. Subclassificando UIBarButtonItem, você pode adicionar um ivar que retém o destino original, permitindo que nossas instâncias de subclasse interceptem, modifiquem e encaminhem a mensagem de ação com o remetente adequado.
Então, CCFBarButtonItem.h:
e CCFBarButtonItem.m
fonte
fonte
Isso também pode ser feito programaticamente (é claro):
Primeiro, crie uma visualização personalizada. Esta visualização personalizada pode conter uma imagem, botão ou qualquer outra coisa que você desejar. A visualização personalizada pode ser feita de forma programática ou em IB:
Em seguida, crie um UIBarButtonItem e inicialize-o com a visualização personalizada.
Agora, basta adicionar o UIBarButton personalizado ao leftBarButtonItem:
fonte
Ok, essa categoria funciona muito bem porque não há problemas com o Popovercontroller :-)
fonte
Confira esta solução simples.
Aqui, 1x1.png é uma imagem png transparente de 1 pixel que você pode baixar no link abaixo
http://commons.wikimedia.org/wiki/File:1x1.png
fonte
Uma outra solução, acho que é mais simples no caso de criar um botão de forma programática:
fonte