uitableviewcell top switch guidelines color change bar iphone cocoa-touch uitableview

iphone - top - ¿Cómo configuro la propiedad UITableViewCellSelectionStyle en algún color personalizado?



switch ios (9)

Estoy desarrollando una aplicación para iPhone, en mi vista de tabla quería un color personalizado para el estilo de selección de celda, leí la referencia de clase UITableViewCell pero solo hay tres constantes definidas para el estilo de selección (azul, gris, ninguno). Vi una aplicación que usaba un color diferente al definido en la referencia.

¿Cómo podemos usar un color diferente a los definidos en la referencia?

Gracias por adelantado.


Anular didSelectRowAtIndexPath: y dibujar un UIView del color que elija e insertarlo detrás de UILabel dentro de la celda. Lo haría algo como esto:

UIView* selectedView; //inside your header - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; selectedView = [[UIView alloc] initWithFrame:[cell frame]]; selectedView.backgroundColor = [UIColor greenColor]; //whatever [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary [selectedView release]; //clean up }

Puede elegir animar esta vista cuando se deseleccione y satisfará sus requisitos.


El establecimiento de selectedBackgroundView parece no tener ningún efecto cuando cell.selectionStyle se establece en UITableViewCellSelectionStyleNone . Cuando no configuro, el estilo solo usa el gris predeterminado.

Usar la primera sugerencia que inserta la UIView personalizada en la celda manipula la celda, pero no aparece cuando se toca la celda, solo después de que se complete la acción seleccionada, que es demasiado tarde porque estoy presionando para una nueva vista. ¿Cómo puedo obtener la vista seleccionada en la celda para mostrar antes del comienzo de la operación seleccionada?


Para agregar un color personalizado, use el siguiente código. Y para hacerlo transparente use alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero) cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0)

Si usa un color personalizado y desea darle un aspecto de esquina redondeada, use:

cell.layer.cornerRadius = 8

Además, use esto para una mejor animación y sensación

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) }


Si ha subclasificado una UITableViewCell, puede personalizar los diversos elementos de la celda anulando lo siguiente:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted) { self.backgroundColor = [UIColor redColor]; } else { self.backgroundColor = [UIColor clearColor]; } [super setHighlighted:highlighted animated:animated]; }

EDIT para iOS7: como dijo Sasho, también necesitas

cell.selectionStyle = UITableViewCellSelectionStyleNone


Sublcass UITableViewCell y anulación setHighlighted:animated:

Puede definir un color de color de selección personalizado configurando backgroundColor (vea la respuesta de Willlster):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if(highlighted) { self.backgroundColor = [UIColor redColor]; } else { self.backgroundColor = [UIColor clearColor]; } [super setHighlighted:highlighted animated:animated]; }

Puede definir una imagen de fondo personalizada configurando la propiedad backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { if( highlighted == YES ) self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; else self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; [super setHighlighted:highlighted animated:animated]; }


Probé algunas de las anteriores, y en realidad prefiero crear mi propia subclase de UITableViewCell y luego anular los métodos touchesBegan / touchesCancelled / touchesEnded . Para hacer esto, ignore todas las propiedades selectedBackgroundView y highlightedColor en la celda y, en su lugar, simplemente establezca estos colores manualmente cada vez que se invoque uno de los métodos anteriores. Por ejemplo, si desea configurar la celda para que tenga un fondo verde con texto rojo, intente esto (dentro de su subclase de celda personalizada):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //Set backgorund self.backgroundColor = [UIColor themeBlue]; //Set text self.textLabel.textColor = [UIColor themeWhite]; //Call super [super touchesBegan:touches withEvent:event]; }

Tenga en cuenta que para que esto funcione, debe configurar:

self.selectionStyle = UITableViewCellSelectionStyleNone;

De lo contrario, primero obtendrá el estilo de selección actual.

EDITAR: sugiero usar el método touchesCancelled para volver a los colores originales de la celda, pero simplemente ignore el método touchesEnded.


La mejor forma de establecer la selección es establecer la selectedBackgroundView de Antecedentes selectedBackgroundView en la celda cuando la construye.

es decir

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; } // configure the cell }

La imagen utilizada debe tener un buen degradado (como la selección predeterminada). Si solo quieres un color plano, puedes usar un UIView en lugar de un UIImageView y establecer el backgroundColor en el color que desees.

Este fondo se aplica automáticamente cuando se selecciona la fila.


- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { // Add your Colour. SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour } - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { // Reset Colour. SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; [self setCellColor:Ripple_Colour ForCell:cell]; //normal color } - (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { cell.contentView.backgroundColor = color; cell.backgroundColor = color; }


- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { // Set Highlighted Color if (highlighted) { self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; } else { self.backgroundColor = [UIColor clearColor]; } }