UIButton: define a imagem para o estado selecionado selecionado

158

Defino uma imagem para os estados do botão Normal, Realçado e Selecionado, mas quando o botão no estado selecionado e pressiono / realce não vi minha imagem destacada, mas apenas a imagem em cinza. É possível definir uma imagem para o estado destacado quando o botão é selecionado?

meu código:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

quando eu faço:

[button setSelected:YES];

e pressione o botão, a imagem "selected.png" não seleciona.

user478681
fonte
+1 Tenho o mesmo problema, espero que haja respostas.
Nick Weaver
3
Brilhante! Quem poderia saber que você pode definir imagens para combinações! Caiu como uma luva para mim!
19711 David H
1
Impressionante!!! sua própria pergunta é resposta para mim ... Funcionou !!!
Kiran S
1
Funciona para mim apenas com o UIControlStateHighlighted, mas ligo button.adjustsImageWhenHighlighted = NO;primeiro.
Graham Perks
Este. Muito melhor do que a solução que eu tinha antes.
Meshach 23/11

Respostas:

231

Encontrei a solução: precisa adicionar linha de adição

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
user478681
fonte
5
Alguma maneira de fazer isso via construtor de interface?
Stephen
6
@stephen: Definir a propriedade "Background" (imagem) do UIButton para diferentes condições de "StateConfig" (Padrão / Destacado / Selecionado / Desativado) A propriedade funciona para mim.
Ajeet
2
A solução de Ajeet não funcionou para mim. Eu também gostaria de saber uma maneira de fazer isso no IB
Lucas
3
Como você não pode definir isso no IB, você pode colocá-lo no método viewDidLoad, e será quase tão bom, pois você poderá alterar a imagem no IB e não precisar se preocupar em atualizar sempre o código para corresponder. [botão setImage: [botão imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave madeira
4
Você pode fazer isso no IB. Veja as capturas de tela na resposta abaixo!
Ríomhaire 31/07
121

Você pode fazer isso no Interface Builder.

Selecione o que UIButtonvocê deseja definir IBe vá para attributes inspector.

Nas capturas de tela, estou usando um tipo de botão personalizado, mas isso não importa.

Padrão personalizado

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Ríomhaire
fonte
5
Personalizado ou Sistema é realmente muito importante. Brinque com os dois e você verá.
Ben Sinclair
9
Não no contexto da pergunta.
Ríomhaire
7
Isso não responde à pergunta. Ele diz que a combinação de estado destacado + selecionado
Rafael Nobre
+1 porque eu perdi totalmente estes pull down menus (eu usei para fazer tudo programaticamente até muito recentemente ...)
Nicolas Miari
30

Swift 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

Para definir a imagem de fundo, podemos usar setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])
kvothe
fonte
A versão do array não funcionou para mim. (pelo menos durante setImage)
huggie 25/04
1
O iOS 10 escurece suas imagens normais / selecionadas, o que é legal e com boa aparência. Se você definir uma imagem selecionada e destacada, ela não escurecerá automaticamente a última. O que é uma chatice.
snakeoil
28

Eu acho que a maioria dos pôsteres aqui não entendem completamente. Eu tive o mesmo problema. A pergunta original era sobre o estado Destacado de um botão Selecionado (COMBINANDO AMBOS ESTADOS) que não pode ser definido no IB e volta ao estado Padrão com algum escurecimento acontecendo. Solução de trabalho apenas como um post mencionado:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
fonte
eu sei, mas eu de alguma forma não era permitido
alghanor
1
por algum motivo, continuo com o problema, mesmo que eu o tenha definido acima. A única maneira de obter uma imagem personalizada para o meu estado de controle é definir apenas UIControlStateHighlighted.
Julius
12

Se você tiver um bom motivo para fazer isso, isso fará o truque

adicione estes destinos:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}
Jorge
fonte
Obrigado por isso, mas na verdade é muito complicado) Eu vou esperar que o botão vai funcionar como descrito acima
user478681
7

No Swift 3.x, você pode definir a imagem destacada quando o botão é selecionado da seguinte maneira:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))
Ashish Verma
fonte
7

No Swift você pode fazer:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))
Roland Keesom
fonte
2

Corrija-me se eu estiver errada. Fazendo

   [button setSelected:YES];

você está claramente mudando o estado dos botões conforme selecionado. Então, naturalmente, pelo código que você forneceu a imagem, será verificado o estado selecionado no seu caso.

visakh7
fonte
não entendo completamente o que você quer dizer com "limpando a mudança de estado ...". isso é muito simples: defino as imagens para os estados descritos acima, adicione ação de destino para este botão e no método que processa minha ação (evento de controle UIControlEventTouchUpInside) Alterno o estado selecionado para o botão [botão setSelected: YES / NO]. E quando o botão atualmente no estado selecionado e pressionado / destacado, vejo apenas uma imagem acinzentada, como se não houvesse configuração de imagem para esse estado.
precisa saber é o seguinte
Eu quis dizer claramente lá. Desculpe por isso. Quando você pressiona o botão primeiro, está definindo seu estado como selecionado, para que a imagem seja exibida. Portanto, se você deseja obter apenas a imagem destacada, faça seu estado como destacado. Não estou certo de que se eu estou recebendo-lo corretamente
visakh7
Quando pressiono o botão primeiro, declaro-o destacado e, quando o solto, o estado será selecionado (conforme definido no meu método de ação). Depois pressiono novamente (botão já está no estado selecionado) e o estado deve ser alterado para realçado e eu devo ver a imagem pressionada.png, mas não a vejo neste caso.
user478681
1

Se alguém está se perguntando como isso funciona no Swift, aqui está minha solução:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)
basedgod
fonte
@basegod, esta é uma solução funcional, mas a maneira como Roland Keesom escreveu é muito mais limpa.
jungledev
1

Swift 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

OU

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

Isso significa que o botão atual no selectedestado, então você o toca, mostra o highlightestado.

yuanjilee
fonte
0

Problema ao definir imageView.highlighted = NO; (a configuração SIM funcionou corretamente e a imagem foi alterada para a realçada).

A solução estava chamando [imageView setHighlighted:NO];

Tudo funcionou corretamente.

DrArt
fonte
0

De onde você deseja ligar

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

O método:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

Crédito acima para Jorge, mas eu melhorei um pouco, fornecendo a solução de trabalho completa

Kingsley Mitchell
fonte
0

Xamarin C #

Fazer OR bit a bit não funciona por algum motivo

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

Os seguintes trabalhos

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);
Pierre
fonte
0

Se você precisar da tonalidade destacada que o sistema operacional fornece por padrão ao tocar e segurar um botão personalizado também para o estado selecionado, use esta subclasse UIButton. Escrito em Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Raj Pawan Gumdal
fonte