Em algum momento do meu aplicativo, tenho um destaque UIButton
(por exemplo, quando um usuário coloca o dedo no botão) e preciso alterar a cor do plano de fundo enquanto o botão está realçado (enquanto o dedo do usuário ainda está no botão) .
Eu tentei o seguinte:
_button.backgroundColor = [UIColor redColor];
Mas isto não está funcionando. A cor permanece a mesma. Tentei o mesmo pedaço de código quando o botão não está destacado e funciona bem. Eu também tentei ligar-setNeedsDisplay
depois de mudar a cor, não teve nenhum efeito.
Como forçar o botão para alterar a cor do plano de fundo?
ios
objective-c
xcode
uibutton
MartinMoizard
fonte
fonte
Respostas:
Você pode substituir
UIButton
osetHighlighted
método.Objetivo-C
Swift 3.0 e Swift 4.1
fonte
backgroundColor = isHighlighted ? .lightGray : .white
Não tenho certeza se isso resolve o que você procura, ou se encaixa no seu cenário geral de desenvolvimento, mas a primeira coisa que eu tentaria seria alterar a cor de fundo do botão no evento touchDown.
Opção 1:
Você precisaria de dois eventos para capturar, o UIControlEventTouchDown seria para quando o usuário pressionar o botão. UIControlEventTouchUpInside e UIControlEventTouchUpOutside serão para quando liberarem o botão para retorná-lo ao estado normal
Opção 2:
Retorne uma imagem criada com a cor de destaque desejada. Isso também pode ser uma categoria.
e altere o estado destacado do botão:
fonte
layer.cornerRadius
e optar pela opção 2, precisará definirclipsToBounds
como true para arredondar os cantos da imagem.Não há necessidade de substituir
highlighted
como propriedade computada. Você pode usar o observador de propriedades para acionar a alteração da cor de fundo:Swift 4
fonte
File>New>File>Cocoa Touch Class
e configurando-a comosubclass of UIButton
. Nomeie o arquivo para exCustomButton
, que se tornará o nome do arquivo e o nome da classe. Dentro deste arquivo, coloque ooverride var highlighted
código mostrado acima. Última etapa, defina o UIButton no Interface Builder para usar essaCustomButton
subclasse, indo para a página Propriedade, onde diz "Classe Personalizada" e possui uma caixa suspensa. Ele diz "UIButton" em letras cinza. A lista suspensa deve mostrar CustomButton. Selecione isso e o botão agora está subclassificado.isHighlighted = false
em algum lugar no começo (por exemplo, na inicialização).Uma extensão genérica útil no Swift:
Swift 3.0
fonte
No Swift, você pode substituir o acessador da propriedade destacada (ou selecionada) em vez de substituir o método setHighlighted
fonte
highlighted
era uma propriedade no UIButton. A resposta é que é uma propriedade no UIControl da qual o UIButton herda.Substituir variável destacada. A adição
@IBInspectable
faz com que você edite a backgroundColor destacada no storyboard, que também é bacana.fonte
uma solução mais compacta (com base na resposta @ aleksejs-mjaliks ):
Swift 3/4 + :
Swift 2:
Se você não deseja substituir, esta é uma versão atualizada da resposta de @ timur-bernikowich ( Swift 4.2 ):
fonte
Extensão UIButton com sintaxe do Swift 3+ :
Use-o como:
Resposta original: https://stackoverflow.com/a/30604658/3659227
fonte
Aqui está uma abordagem no Swift, usando uma extensão UIButton para adicionar um IBInspectable, chamado featuredBackgroundColor. Semelhante à subclasse, sem exigir uma subclasse.
Eu espero que isso ajude.
fonte
Você pode usar esta categoria que inclui o método setBackgroundColor: forState:
https://github.com/damienromito/UIButton-setBackgroundColor-forState-
fonte
Minha melhor solução para o Swift 3+ sem subclassificação.
Com essa extensão, é fácil gerenciar cores para diferentes estados e desbotará sua cor normal automaticamente, caso a cor destacada não seja fornecida.
fonte
ATUALIZAR:
Use a biblioteca UIButtonBackgroundColor Swift.
VELHO:
Use os ajudantes abaixo para criar uma imagem de 1 px x 1 px com uma cor de preenchimento em escala de cinza:
ou uma cor de preenchimento RGB:
Em seguida, use isso
image
para definir a imagem de fundo do botão:Ajudantes
Nota:
ACU
é o prefixo da classe da minha biblioteca estática do Cocoa Touch chamada Acani Utilities, em que AC é para Acani e U é para Utilities.fonte
Tente isso !!!!
Para Evento TouchedDown, defina Uma cor e, para TouchUpInside, defina a outra.
fonte
- (IBAction)onButtonTouchDragOutside:(UIButton *)sender {
para garantir que a cor não permaneça acesa quando o usuário acidentalmente puxa o dedo do botão.Subclasse o UIButton e adicione propriedades inspecionáveis para uso conveniente (escrito no Swift 3.0):
fonte
Você pode subclassificar o UIButton e criar um bom forState.
colourButton.h
colourButton.m
Notas (Este é um exemplo, eu sei que há problemas e aqui estão alguns)
Eu usei um NSMutableDictionay para armazenar o UIColor para cada estado, tenho que fazer uma conversão de texto desagradável para a chave, pois o UIControlState não é um bom int direto. Se você pudesse iniciar uma matriz com tantos objetos e usar o estado como um índice.
Por causa disso, muitos têm dificuldades com, por exemplo, um botão selecionado e desativado, é necessária alguma lógica.
Outro problema é que, se você tentar definir várias cores ao mesmo tempo, eu não tentei com um botão, mas se você puder fazer isso, pode não funcionar
Eu assumi que este é o StoryBoard, não há init, initWithFrame, então adicione-os se precisar.
fonte
Swift 5 , obrigado @Maverick
fonte
Detalhes
Solução
Uso
fonte
Tente isso se você tiver uma imagem:
ou veja se
showsTouchWhenHighlighted
é o suficiente para você.fonte
Eu tenho código aberto uma subclasse UIButton , STAButton , para preencher esse buraco de funcionalidade. Disponível sob a licença MIT. Funciona para iOS 7 ou superior (não testei com versões mais antigas do iOS).
fonte
Para resolver esse problema, criei uma categoria para lidar
backgroundColor
com os estados comUIButtons
:ButtonBackgroundColor-iOS
Você pode instalar a categoria como um pod .
Fácil de usar com Objective-C
Ainda mais fácil de usar com o Swift :
Eu recomendo que você importe o pod com:
Usando use_frameworks! no seu Podfile facilita o uso de seus pods com Swift e objetivo-C.
IMPORTANTE
Também escrevi uma postagem no blog com mais informações.
fonte
fonte
Use https://github.com/swordray/UIButtonSetBackgroundColorForState
Adicionar ao Podfile usando CocoaPods
Rápido
Objetivo-C
fonte
Tente
tintColor
:fonte
NSLog(@"%@", _button);
?UIButtonTypeCustom
.Aqui está o código no Swift para selecionar o estado do botão:
Exemplo:
fonte
Solte-o e
pronto : * a propriedade pode ser definida no IB e, se nenhum fundo realçado estiver definido, o fundo não será alterado quando pressionado
fonte
A
UIIImage
extensão abaixo gera um objeto de imagem com o parâmetro de cor especificado.Um exemplo de uso de um botão pode ser aplicado ao objeto de botão como:
fonte
simples é usar esse UIButton Extension ONLY
e use isso
fonte
se você não substituir, defina duas ações touchDown touchUpInside
fonte
Swift 3:
fonte
no Swift 5
Para quem não quer usar plano de fundo colorido para vencer o estado selecionado
Simplesmente, você pode superar o problema usando a instrução #Selector & if para alterar as cores UIButton de cada estado individualmente facilmente
Por exemplo:
fonte