Mudando a cor de fundo da célula selecionada?

Alguém sabe como alterar a cor de fundo de uma célula usando UITableViewCell, para cada célula selecionada? Eu criei este UITableViewCell dentro do código para TableView.

A alteração da propriedade selectedBackgroundView está correta e é a maneira mais simples. Eu uso o seguinte código para alterar a cor da seleção:

// set selection color UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame]; myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]; cell.selectedBackgroundView = myBackView; [myBackView release]; 

Eu finalmente consegui fazer isso funcionar em uma exibição de tabela com o estilo definido como Agrupado.

Primeiro defina a propriedade selectionStyle de todas as células para UITableViewCellSelectionStyleNone .

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Em seguida, implemente o seguinte no delegado de exibição de tabela:

 static NSColor *SelectedCellBGColor = ...; static NSColor *NotSelectedCellBGColor = ...; - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow]; if (currentSelectedIndexPath != nil) { [[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor]; } return indexPath; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor]; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (cell.isSelected == YES) { [cell setBackgroundColor:SelectedCellBGColor]; } else { [cell setBackgroundColor:NotSelectedCellBGColor]; } } 
 // animate between regular and selected state - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; if (selected) { self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; } else { self.backgroundColor = [UIColor clearColor]; } } 
 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor yellowColor]; } 

Eu criei o UIView e configurei a propriedade da célula selectedBackgroundView:

 UIView *v = [[UIView alloc] init]; v.backgroundColor = [UIColor redColor]; cell.selectedBackgroundView = v; 

Se você estiver falando sobre células selecionadas, a propriedade será -selectedBackgroundView . Isso será mostrado quando o usuário selecionar seu celular.

SWIFT 4, XCODE 9, IOS 11

Após alguns testes, isso removerá a cor do plano de fundo quando a seleção for desmarcada ou a célula for tocada uma segunda vez quando a seleção da visualização da tabela estiver definida como “Seleção múltipla”. Também funciona quando o estilo de visualização de tabela está definido como “Agrupado”.

 extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let cell = tableView.cellForRow(at: indexPath) { cell.contentView.backgroundColor = UIColor.darkGray } } } 

Nota: Para que isso funcione como você vê abaixo, a propriedade Selection de sua célula pode ser definida como qualquer coisa, MAS nenhuma.

Como fica com diferentes opções

Estilo: Simples , Seleção: Seleção Única

Selecção Única

Estilo: Simples , Seleção: Seleção Múltipla

Seleção Múltipla

Estilo: Agrupado , Seleção: Seleção Múltipla

Seleção Múltipla Agrupada

Bônus – Animação

Para uma transição de colors mais suave, tente alguma animação:

 extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let cell = tableView.cellForRow(at: indexPath) { UIView.animate(withDuration: 0.3, animations: { cell.contentView.backgroundColor = UIColor.darkGray }) } } } 

Transição de cor animada

Bônus – Texto e Alteração de Imagem

Você pode notar que o ícone e a cor do texto também mudam quando a célula é selecionada. Isso acontece automaticamente quando você define as propriedades UIImage e UILabel Highlighted

UIImage

  1. Forneça duas imagens coloridas:

Duas imagens coloridas

  1. Defina a propriedade da imagem realçada:

Propriedade realçada

UILabel

Basta fornecer uma cor para a propriedade Realçada:

Cor realçada

Eu tive sorte com o seguinte:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { bool isSelected = // enter your own code here if (isSelected) { [cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]]; [cell setAccessibilityTraits:UIAccessibilityTraitSelected]; } else { [cell setBackgroundColor:[UIColor clearColor]]; [cell setAccessibilityTraits:0]; } } 

Eu tenho um UITableViewCell altamente personalizado. Então eu implementei minha própria seleção de células.

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Eu criei um método na class da minha célula:

 - (void)highlightCell:(BOOL)highlight { if (highlight) { self.contentView.backgroundColor = RGB(0x355881); _bodyLabel.textColor = RGB(0xffffff); _fromLabel.textColor = RGB(0xffffff); _subjectLabel.textColor = RGB(0xffffff); _dateLabel.textColor = RGB(0xffffff); } else { self.contentView.backgroundColor = RGB(0xf7f7f7);; _bodyLabel.textColor = RGB(0xaaaaaa); _fromLabel.textColor = [UIColor blackColor]; _subjectLabel.textColor = [UIColor blackColor]; _dateLabel.textColor = RGB(0x496487); } } 

Na minha class UITableViewController em ViewWillAppear, adicionei isto:

 NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow]; SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection]; [cell highlightCell:NO]; 

Em didSelectRow adicionou isto:

 SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath]; [cell highlightCell:YES]; 

Para iOS7 + e se você estiver usando o Interface Builder , subclass sua célula e implemente:

Objetivo-C

 - (void)awakeFromNib { [super awakeFromNib]; // Default Select background UIView *v = [[UIView alloc] init]; v.backgroundColor = [UIColor redColor]; self.selectedBackgroundView = v; } 

Swift 2.2

 override func awakeFromNib() { super.awakeFromNib() // Default Select background self.selectedBackgroundView = { view in view.backgroundColor = .redColor() return view }(UIView()) } 

Isso funcionou perfeitamente com as chamadas agrupadas: Implementar uma subclass personalizada de UITableViewCell

Isso vai respeitar cantos e tal …

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; if(selected) [self setBackgroundColor:[UIColor colorWithRed:(245/255.0) green:(255/255.0) blue:(255/255.0) alpha:1]]; else [self setBackgroundColor:[UIColor whiteColor]]; } 

Se você quiser apenas remover a cor de fundo cinza, faça o seguinte:

 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone]; } 

Consegui resolver esse problema criando uma subclass de UITableViewCell e implementando o método setSelected: animated:

 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state if(selected) { [self setSelectionStyle:UITableViewCellSelectionStyleNone]; [self setBackgroundColor:[UIColor greenColor]]; } else { [self setBackgroundColor:[UIColor whiteColor]]; } } 

O truque foi definir o

 cell.selectionStyle = UITableViewCellSelectionStyleDefault; 

no controlador de exibição de implementação e, em seguida, no tableViewCell defini-lo como

 [self setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Espero que isto ajude. 🙂

O estilo padrão é cinza e destrói as colors da célula se isso for feito programaticamente. Você pode fazer isso para evitar isso. (em Swift)
cell.selectionStyle = .None

Em Swift

 let v = UIView() v.backgroundColor = self.darkerColor(color) cell?.selectedBackgroundView = v; ... func darkerColor( color: UIColor) -> UIColor { var h = CGFloat(0) var s = CGFloat(0) var b = CGFloat(0) var a = CGFloat(0) let hueObtained = color.getHue(&h, saturation: &s, brightness: &b, alpha: &a) if hueObtained { return UIColor(hue: h, saturation: s, brightness: b * 0.75, alpha: a) } return color } 

Confira AdvancedTableViewCells no código de exemplo da Apple .

Você vai querer usar o padrão de célula composta.

Crie um UITableViewCell personalizado. Dentro da sua class personalizada, substitua a function “setSelected” e altere a cor de fundo do contentView . Você também pode replace a function “setHighlighted”.

Em Swift:

 class myTableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state // Add your color here self.contentView.backgroundColor = UIColor.whiteColor() } override func setHighlighted(highlighted: Bool, animated: Bool) { // Add your color here self.contentView.backgroundColor = UIColor.whiteColor() } } 

Funciona para mim

 UIView *customColorView = [[UIView alloc] init]; customColorView.backgroundColor = [UIColor colorWithRed:180/255.0 green:138/255.0 blue:171/255.0 alpha:0.5]; cell.selectedBackgroundView = customColorView; 

no Swift 3, convertido de iluminar resposta.

 override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if(selected) { self.selectionStyle = .none self.backgroundColor = UIColor.green } else { self.backgroundColor = UIColor.blue } } 

(no entanto, a visualização só muda quando a seleção é confirmada, liberando o dedo)

Aqui está uma maneira rápida de fazer isso corretamente no Interface Builder (dentro de um Storyboard). Arraste um UIView simples para o topo do seu UITableView como em UIView Em seguida, conecte a saída selectedBackgroundView seu celular a essa exibição. Você pode até mesmo conectar várias tomadas de células a essa visão. Saída da célula

Para uma solução que funcione (corretamente) com o UIAppearance para iOS 7 (e superior?) Subclassificando o UITableViewCell e usando seu selectedBackgroundView padrão para definir a cor, dê uma olhada na minha resposta para uma pergunta semelhante aqui .

 - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor yellowColor]; } - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; cell.contentView.backgroundColor = nil; } 

Eu tentei cada uma entre as respostas acima, mas nenhuma delas é melhor para mim,

então eu olhei em um dos methods nativos, e está funcionando bem.

primeiro, faça cellSelectionStyle para None e, em seguida, vá para esta solução.

 func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? { let cell = tableView.cellForRow(at: indexPath); //cell which is getting deselected, make whatever changes that are required to make it back normal cell.backgroundColor = kNormalColor; return indexPath; } func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { let cell = tableView.cellForRow(at: indexPath); //cell which is getting selected, make whatever changes that are required to make it selected cell.backgroundColor = kSelectedColor; return indexPath; } 

A vantagem deste método sobre o outro é:

  1. Funciona para seleção múltipla de células
  2. Você pode alterar qualquer elemento, o que você quiser, não apenas a cor de fundo de determinada célula quando ela for selecionada, bem como desmarcada.
 override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.contentView.backgroundColor = .black } else { self.contentView.backgroundColor = .white } }