2009-05-22 9 views
38

Tengo una subclase personalizada UITableViewCell. Establecí el contentView de mi subclase de celda en una clase personalizada UIView en la cual anulo -drawRect: y hago todo el dibujo allí.UITableViewCell: ¿Cómo evitar el fondo de selección azul sin borking isSelected property?

También, 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 una actuación golpear, debe ser así).

Problema: Sigo dibujando el fondo degradado bastante azul predeterminado detrás de mi celda (en las áreas transparentes) cuando se selecciona o resalta (al presionar). Esto está oscureciendo la imagen detrás de la mesa, lo cual es malo.

Objetivo: Para evitar que el fondo azul de la pendiente de aparecer, pero aún así ser capaz de inspeccionar los cell.isSelected y cell.isHighlighted inmuebles de dentro -[MyContentView drawRect:] para determinar cómo dibujar mi propia selección personalizada/resaltado.

Lo que he intentado:

  1. establecer cell.selectionStyle = UITableViewCellSelectionStyleNone tiene el efecto deseado de prevenir el bonito fondo azul de la selección de gradiente, sino que también evita los cell.isSelected y cell.isHighlighted propiedades de estar ajustado correctamente, lo que significa que no puedo hacer mi propia selección personalizada/culminante dibujo

  2. establecer cell.selectionBackgroundView = nil y cell.backgroundView = nil en el método -init o -prepareForReuse de la célula no impide la selección de gradiente azul de nuevo planta

  3. establecer cell.selectionBackgroundView = nil en el método -[MyContentView -drawRect:]hace tienen el efecto deseado de prevenir el fondo de selección azul de la pendiente, pero que parece muy janky

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

Respuesta

47

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

+0

Jason, gracias! su sugerencia ha hecho el truco. un par de notas: - No estoy seguro de cómo recopiló esa información del artículo, ya que no fue uno de los puntos importantes. pero buen trabajo :) - ese artículo es definitivamente muy informativo. desafortunadamente, también parece un poco engañoso ya que ignora el caso común donde se necesita más personalización celular, en cuyo caso es mejor crear una subclase y reemplazar la -drawRect de contentView: para lograr un desplazamiento rápido como se explica aquí: http: // blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ –

+9

Solo para aclarar esto más para lectores futuros, en lugar de establecer cualquier cell.selectionStyle, establezca cell.selectedBackgroundView en un UIView - I set a una UIView con los mismos límites que mi celda, y luego configure alfa a 0.5 para resaltar la celda pero aún así dejar todo visible. ¡No olvides llamar a [self setNeedsDisplay] en tu método setSelected! –

+0

@KendallHelmstetterGelner Todo con este método funciona, excepto que a pesar de configurar 'alpha' en 0.5 y llamar' setNeedsDisplay', el color de fondo seleccionado es completamente blanco y cubre la vista de la celda cuando se selecciona (a pesar de haber configurado 'UIView' /' selectedBackgroundView' s color de fondo a 'clearColor'). ¿Algunas ideas? – sooper

-1

Lo que ha funcionado para mí en el pasado es simplemente poner:

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

En mis subclases UITableViewCell (porque no va a llamar a super y hacerse resaltada). Espero que esto sea lo que estabas buscando.

+0

thx joe, pero lo he intentado y no evita el fondo azul de gradiente de selección –

+0

he editado mi Q anterior para incluir que probé esto y no tenía el efecto deseado –

68

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

por lo que tendrá 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]; 
} 
+6

Esta es de lejos la mejor respuesta. Más personas necesitan hacerlo. – samvermette

+1

@sam De acuerdo. Este método solo funciona si tiene una subclase UITableViewCell (que la pregunta original mencionó) y en mi opinión es la mejor solución. – BLeB

+0

Tengo que descomentar [super setSelected: selected animado: animado] para obtener la propiedad isSelected funcionando. – angelokh

61
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
+2

Estaba buscando esto. ¡Gracias! – Oscar

+1

Simplemente funciona. ¡Gracias! – saimonx

+1

Esto funciona. –

-12

¿Qué tal esto?

// disable user interaction 
cell.userInteractionEnabled = NO; 
+7

enemigos odiarán – Andy

+0

+1 andy para un comentario hilarante! lol – Pavan

1

Con mucho, el método más fácil - en mi opinión - para lograr esto, es mediante el establecimiento de la tabla de atributos Ver casilla de verificación en la pantalla de Interface Builder, donde dice "Mostrar selección de tacto". Ver la siguiente captura de pantalla:

enter image description here

+2

Desmarcar esa opción parece no tener ningún efecto. Sin embargo, acabo de encontrar una solución que he publicado en http://stackoverflow.com/a/22936734/804616 – trss

Cuestiones relacionadas