¿Cambiar el color de fondo de la celda seleccionada?

¿Alguien sabe cómo cambiar el color de fondo de una celda usando UITableViewCell, para cada celda seleccionada? Creé este UITableViewCell dentro del código para TableView.

Cambiar la propiedad selectedBackgroundView es correcta y la forma más sencilla. Utilizo el siguiente código para cambiar el color de selección:

// 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]; 

Finalmente logré hacer que esto funcione en una vista de tabla con el estilo establecido en Agrupado.

Primero configure la propiedad UITableViewCellSelectionStyleNone de todas las celdas en UITableViewCellSelectionStyleNone .

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

A continuación, implemente lo siguiente en su delegado de vista de tabla:

 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]; } 

Creé UIView y establecí la propiedad de la celda selectedBackgroundView:

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

Si está hablando de celdas seleccionadas, la propiedad es -selectedBackgroundView . Esto se mostrará cuando el usuario seleccione su celda.

SWIFT 4, XCODE 9, IOS 11

Después de algunas pruebas, esto eliminará el color de fondo cuando se deseleccione o se toque la celda por segunda vez cuando la selección de la vista de tabla esté configurada en “Selección múltiple”. También funciona cuando el estilo de vista de tabla está establecido en “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 esto funcione como se ve a continuación, la propiedad Selección de su celda se puede establecer en cualquier cosa PERO Ninguna.

Cómo se ve con diferentes opciones

Estilo: Normal , Selección: Selección única

Selección única

Estilo: Normal , Selección: Selección múltiple

Selección múltiple

Estilo: Agrupado , Selección: Selección múltiple

Selección múltiple agrupada

Bono – Animación

Para una transición de color más suave, pruebe alguna animación:

 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 }) } } } 

Transición de color animada

Bonificación: cambio de texto e imagen

Puede observar que el icono y el color del texto también cambian cuando se selecciona la celda. Esto sucede automáticamente cuando configura el UIImage y UILabel Propiedades destacadas

UIImage

  1. Suministre dos imágenes en color:

Dos imágenes coloreadas

  1. Establezca la propiedad de imagen resaltada:

Propiedad destacada

UILabel

Solo proporcione un color para la propiedad Destacado:

Color resaltado

He tenido suerte con lo siguiente:

 - (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]; } } 

Tengo una UITableViewCell altamente personalizada. Entonces implementé mi propia selección de células.

 cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Creé un método en la clase de mi celular:

 - (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); } } 

En mi clase UITableViewController en ViewWillAppear agregué esto:

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

En didSelectRow agregó esto:

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

Para iOS7 + y si está utilizando Interface Builder, entonces subclasifique su celda e implemente:

C objective

 - (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()) } 

Esto funcionó perfectamente con llamadas agrupadas: Implementar una subclase personalizada de UITableViewCell

Esto respetará las esquinas y 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]]; } 

Si solo desea eliminar el color de fondo gris, haga lo siguiente:

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

Pude resolver este problema creando una subclase de UITableViewCell e implementando el método setSelected: animado:

 - (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]]; } } 

El truco fue establecer el

 cell.selectionStyle = UITableViewCellSelectionStyleDefault; 

en el controlador de vista de implementación y luego en tableViewCell configurándolo como

 [self setSelectionStyle:UITableViewCellSelectionStyleNone]; 

Espero que esto ayude. 🙂

El estilo predeterminado es gris y destruye los colores de la celda si se hizo mediante progtwigción. Puedes hacer esto para evitar eso. (en Swift)
cell.selectionStyle = .None

En 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 } 

Eche un vistazo a AdvancedTableViewCells en el código de muestra de Apple .

Querrá usar el patrón de celda compuesta.

Crea una UITableViewCell personalizada. Dentro de su clase personalizada anula la función “setSelected” y cambia el color de fondo de contentView . También puede anular su función “setHighlighted”.

En 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 mi

 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; 

en Swift 3, convertido de ilumina la respuesta.

 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 } } 

(sin embargo, la vista solo cambia una vez que la selección se confirma al soltar el dedo)

Aquí hay una forma rápida de hacerlo bien en Interface Builder (dentro de Storyboard). Arrastre una UIView simple a la parte superior de su UITableView como en UIView A continuación, conecte el Outlet ViewView selectedBackgroundView su celda a esta vista. Incluso puede conectar salidas de varias celdas a esta vista única. Salida de la célula

Para una solución que funcione (correctamente) con UIAppearance para iOS 7 (¿y superior?) UITableViewCell subclasificación de UITableViewCell y utilizando su selectedBackgroundView predeterminado para establecer el color, eche un vistazo a mi respuesta a una pregunta similar aquí .

 - (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; } 

He probado cada una de las respuestas anteriores, pero ninguna de ellas es la más adecuada para mí,

luego he analizado uno de los métodos nativos, y está funcionando bien.

primero, haga que CellSelectionStyle sea Ninguno y luego busque esta solución.

 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; } 

ventaja de estos métodos sobre otros todos es:

  1. Funciona para la selección de celdas múltiples
  2. Puede cambiar cualquier elemento, lo que quiera, no solo el color de fondo de una celda determinada cuando se selecciona o deselecciona.
 override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.contentView.backgroundColor = .black } else { self.contentView.backgroundColor = .white } }