uitableviewcell source number example data iphone uitableview colors background tableview

iphone - source - ¿Cambiar el color de fondo de la celda seleccionada?



uitableviewcell swift 3 (24)

¿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.


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

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

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

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

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:

  1. Establezca la propiedad de imagen resaltada:

UILabel

Solo proporcione un color para la propiedad Destacado:


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 A continuación, conecte el Outlet ViewView selectedBackgroundView su celda a esta vista. Incluso puede conectar salidas de varias celdas a esta vista única.


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


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

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


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



El estilo predeterminado es gris y destruye los colores de la celda si se hizo mediante programació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 }


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


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


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;


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.

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


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

C objetivo

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


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 here .


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. :)


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


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

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


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


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)


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


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


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


override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.contentView.backgroundColor = .black } else { self.contentView.backgroundColor = .white } }