2009-07-26 13 views
13

He añadido una sombra de texto a las células en mi UITableView para darles un aspecto grabado:Extracción sombra texto en UITableViewCell cuando se selecciona

cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.000]; 
cell.textLabel.shadowColor = [UIColor whiteColor]; 
cell.textLabel.shadowOffset = CGSizeMake(0, 1); 

Puesto que el color de la sombra es en realidad blanco, cuando una fila se selecciona y se vuelve azul, la sombra blanca se vuelve realmente visible y hace que el texto se vea feo.

¿Alguien sabe cómo puedo eliminar la sombra antes de que se aplique el estilo de selección de celda predeterminado?

que he intentado:

  1. Usando -tableView:willSelectRowAtIndexPath: a desarmar la sombra con cell.textLabel.shadowColor = nil pero esto no funciona en el tiempo - la sombra consigue desarmar sólo después de que se aplica el estilo de selección azul.
  2. Comprobando cell.selected en tableView:cellForRowAtIndexPath: antes de configurar la sombra, pero esto obviamente no funciona ya que la celda no se vuelve a dibujar después de una selección.

También intenté sobreescribir el método delegado -tableView:willDisplayCell:forRowAtIndexPath: como Kevin sugirió a continuación. De las declaraciones de registro que puse, este método de delegado solo se llama justo antes de que se dibuje una celda: cuando se toca una celda, ya es demasiado tarde. Este es el código que utilicé

(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"in willDisplayCell"); 
    if (cell.highlighted || cell.selected) { 
    NSLog(@"drawing highlighed or selected cell"); 
    cell.textLabel.shadowColor = nil; 
    } else { 
    cell.textLabel.shadowColor = [UIColor whiteColor]; 
    } 
} 

Respuesta

35

Una forma que debería funcionar es extender UITableViewCell y anular los métodos setSelected AND setHighlighted, configurando el estado de sombra paralela en consecuencia. Esto se asegurará de que esté pintado al mismo tiempo que la actualización de resaltado de fondo.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 
    [self applyLabelDropShadow:!highlighted]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    [self applyLabelDropShadow:!selected]; 
} 

- (void)applyLabelDropShadow:(BOOL)applyDropShadow 
{ 
    self.textLabel.shadowColor = applyDropShadow ? [UIColor whiteColor] : nil; 
} 
+0

En realidad, puede que necesite anular setHighlighted: animado y no tocar setSelected: animado en absoluto. Lo probaría primero. –

+0

¡Gracias, Mike! Esto funciona perfectamente –

+3

Puedo confirmar que debe sobrescribir ambos. La celda se resalta cuando la toca, luego se selecciona cuando levanta el dedo. Si solo anulas setHighlighted :, la sombra volverá a aparecer cuando finalice el toque.Incluso si pasa a otra vista después de la selección, es notable. – benzado

3

Uso -tableView:willDisplayCell:forRowAtIndexPath:. Es lo último que se llama justo antes de que se muestre realmente la celda, por lo que puede consultar su propiedad selected y establecer la sombra de texto en consecuencia.

+2

Gracias Kevin. Leí la documentación sobre esto una vez que apuntó '-tableView: willDisplayCell: forRowAtIndexPath:' out, y parece que debería hacer el truco, pero no es así. Creo que '-tableView: willDisplayCell: forRowAtIndexPath:' se invoca cuando la celda se dibuja primero, y en el momento en que se toca una celda, ya se ha dibujado y no se llama al método delegado. Actualizaré mi pregunta con el código que probé. ¡Gracias de nuevo! –

+1

Ok, creo que la solución correcta es crear tu propia subclase UITableViewCell y anular '-setSelected: animated:' allí para ajustar la sombra según sea necesario. –

3

Debe anular tableView:willDisplayCell:forRowAtIndexPath: y hay que establecer el backgroundColor a [UIColor clearColor], también, sólo se debe actuar sobre el estado resaltado, el estado seleccionado tiene un significado ligeramente diferente

2

creo que esto es mejor:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 
    [self applyLabelDropShadow:!self.highlighted]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    [self applyLabelDropShadow:!self.selected]; 
} 

No habrá sombras durante los cambios entre estados.

Cuestiones relacionadas