uitableviewdatasource uitableviewcontroller uitableviewcell example iphone objective-c cocoa-touch uikit

iphone - uitableviewcell - uitableviewcontroller swift 4



UITableViewCell: ¿Cómo prevenir el fondo de selección azul sin borking isSelected property? (6)

Tengo una subclase personalizada UITableViewCell . Configuré el contentView de mi subclase de celda en una clase UIView personalizada en la que -drawRect: y hago todo el dibujo allí.

Además, estoy configurando cell.contentView.opaque = NO para lograr transparencia en ciertas áreas de la celda (desafortunadamente, una imagen de fondo detrás de la tabla debe mostrarse a través de cada celda en ciertas partes para lograr un efecto estilístico. Sé que esto es un golpe de rendimiento, debe ser así).

Problema: Todavía veo el fondo degradado azul bastante predeterminado que se dibuja detrás de mi celda (en las áreas transparentes) cuando se selecciona o resalta (se presiona). Esto está oscureciendo la imagen detrás de la mesa, lo cual es malo.

Objetivo: evitar que aparezca el fondo degradado azul, pero aún así poder inspeccionar la cell.isSelected y la cell.isHighlighted propiedades cell.isHighlighted desde dentro -[MyContentView drawRect:] para determinar cómo dibujar mi propia selección / resaltado personalizado.

Lo que he intentado:

  1. configuración cell.selectionStyle = UITableViewCellSelectionStyleNone tiene el efecto deseado de evitar el fondo de selección de gradiente azul bonito, pero también evita que las propiedades cell.isSelected y cell.isHighlighted se establezcan correctamente, lo que significa que no puedo hacer mi propio dibujo de selección / resaltado personalizado

  2. configuración cell.selectionBackgroundView = nil y cell.backgroundView = nil en el método -init o -init la celda no impide el fondo de selección de gradiente azul

  3. configuración cell.selectionBackgroundView = nil en el método -[MyContentView -drawRect:] tiene el efecto deseado de evitar el fondo azul de selección de degradado, pero eso parece muy janky

  4. anulación - [UITableViewCell setSelected: animated:] para ser un no-op. esto no tiene el efecto deseado de evitar el fondo azul de gradiente de selección


¿Qué tal esto?

// disable user interaction cell.userInteractionEnabled = NO;


Con mucho, el método más fácil, en mi opinión, para lograr esto, es establecer la casilla de atributos de vista de tabla en la pantalla del generador de interfaz donde dice "Mostrar selección al tocar". Vea la captura de pantalla a continuación:


Lo que funcionó para mí en el pasado es simplemente poner:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { }

En mis subclases UITableViewCell (porque no llamará a super y se destacará). Espero que esto sea lo que estabas buscando.


También debe anular setHighlighted: para evitar que el degradado azul se muestre alguna vez. Si simplemente anula setHighlighted: entonces termina con un efecto de selección momentánea.

entonces tendrás estos dos métodos:

- (void)setHighlighted: (BOOL)highlighted animated: (BOOL)animated { // don''t highlight } - (void)setSelected: (BOOL)selected animated: (BOOL)animated { // don''t select //[super setSelected:selected animated:animated]; }


Un excelente recurso en la personalización de UITableViews ha sido este post de Matt Gallagher. Lo que querrá hacer es establecer selectedBackgroundView en una nueva vista (en lugar de nil) que sea transparente o un UIImageView.


cell.selectionStyle = UITableViewCellSelectionStyleNone;