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:
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 propiedadescell.isSelected
ycell.isHighlighted
se establezcan correctamente, lo que significa que no puedo hacer mi propio dibujo de selección / resaltado personalizadoconfiguración
cell.selectionBackgroundView = nil
ycell.backgroundView = nil
en el método-init
o-init
la celda no impide el fondo de selección de gradiente azulconfiguració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 jankyanulació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;