Como desativar o estado de controle de destaque de um UIButton?

147

Eu tenho um UIButton que, quando selecionado, não deve mudar de estado ao ser tocado. O comportamento padrão é que ele fique no UIControlStateHighlighted ao ser tocado, e isso está me deixando irritado.

Sugestões?

kbanman
fonte

Respostas:

313

Seu botão deve estar buttonTypedefinido como Personalizado.

No IB, você pode desmarcar "Realçar ajusta a imagem".

Programaticamente, você pode usar theButton.adjustsImageWhenHighlighted = NO;

Opções semelhantes também estão disponíveis para o estado "desativado".

Haydn
fonte
1
Alguma chance de você saber qual seria a versão programática disso? No momento, eu tenho o funcionamento hackishly, desativando-o e vestindo-o como sendo selecionado.
kbanman
99
uibutton.adjustsImageWhenHighlighted = NO;
Haydn
43
Verifique também se o tipo de botão está definido como PERSONALIZADO. (Como Mosib Asad mencionou em outra resposta)
Vlad Lego
Ótimo!!! apenas uma pequena e óbvia mudança que eu perdi !!! Eu havia definido o tipo de classe UIButton como MyCustomClass, mas esqueci de mudar esse. Por isso, estava dando efeito destacado no botão não selecionado. Agradeço novamente.
Vinod Supnekar
38

Além da resposta acima de desmarcar "realçar ajusta a imagem" no IB, verifique se o tipo de botão está definido como PERSONALIZADO.

Mosib Asad
fonte
2
Esta foi a peça que faltava: tipo de botão PERSONALIZADO. Thanx!
JOM
1
E se eu gostaria de manter como UIButton do sistema? não consigo remover o destaque ajusta a imagem?
Amjad Husseini
36

Isso funcionará para você:

[button setBackgroundImage:[UIImage imageNamed:@"button_image"] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:@"button_image_selected"] forState:UIControlStateSelected];
[button setBackgroundImage:[UIImage imageNamed:@"button_image_selected"] forState:UIControlStateSelected | UIControlStateHighlighted];

3ª linha é o truque aqui ...

Isso funciona da mesma maneira para definir image / backgroundImage

Manish Ahuja
fonte
1
Isso funciona perfeito para mim. A adjustsImageWhenHighlightedpropriedade de UIButtonparece afetar apenas a imagem de fundo.
Michael Thiel
Esteja ciente de que, se você decidir atribuir uma imagem ao 'estado desativado', não chamará setBackgroundImage. Em vez disso, você deve fazer o seguinte [botão setImage: image forState: UIControlStateDisabled]; Também esteja ciente de que, conforme mencionado neste segmento, a propriedade UDButton ajustaImageWhenHighlighted apenas afeta a imagem de plano de fundo.
HamasN
26
adjustsImageWhenHighlighted = NO;
KETAN
fonte
23
button.adjustsImageWhenDisabled = NO;

é igualmente útil por ter a aparência de um botão desativado.

Tim
fonte
5

Dependendo do que muda do padrão para o estado destacado do botão, você pode chamar alguns métodos para configurá-los para o que você precisa. Então, se a imagem mudar, você pode fazer

[myButton setImage:[myButton imageForState:UIControlStateNormal] forState:UIControlStateHighlighted];

Se o texto mudar, você pode fazer

[myButton setTitle:[myButton titleForState:UIControlStateNormal] forState:UIControlStateHighlighted];

outras funções similares:

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

- (void)setTitleShadowColor:(UIColor *)color forState:(UIControlState)state

Dimitris
fonte
setTitleColor é tudo que eu precisava para desativar destaque no texto de UIButton
atulkhatri
3

OK, aqui está uma solução fácil, se isso funcionar para você, depois de uma semana batendo com a cabeça nisso, finalmente me ocorreu definir apenas = NÃO para a primeira linha do método IBAction para o TouchUpInside ou TouchDown, ou o que funcionar. Para mim, estava tudo bem no TouchUpInside.

-(IBAction)selfDismiss:(id)sender {

    self.btnImage.highlighted = NO;

    NSLog(@"selfDismiss");

    etc, etc, etc.

}
therealbuckley
fonte
3

Para Swifty Developer -

yourButton.adjustsImageWhenHighlighted = false
iDeveloper
fonte
3

Swift 3+

button.adjustsImageWhenHighlighted = false

button.adjustsImageWhenDisabled = false
yuanjilee
fonte
2

apenas duas coisas:

UIButton *btnTransparentComponent = [UIButton buttonWithType:UIButtonTypeCustom];
btnTransparentComponent.adjustsImageWhenHighlighted = NO;
Alok
fonte
2

Tive um problema semelhante e descobri que "desmarcar" Limpa o conteúdo gráfico no criador de interface corrigiu meu problema

insira a descrição da imagem aqui

Jeff
fonte
2

faça seu botão Digite - "Personalizado" e Desmarque - Realçado Ajuste a imagem e está pronto.

Khushboo
fonte
-3

Para evitar definir quebra de linha do UIButton como Clip , use o padrão Truncate Middle

insira a descrição da imagem aqui

János
fonte