2009-07-26 18 views
13

Ho un'ombra di testo per le celle a mio UITableView per dare loro un aspetto inciso:Rimozione ombra testo in UITableViewCell quando è selezionata

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

Dal momento che il colore dell'ombra in realtà è bianco, quando viene selezionata una riga e diventa blu, l'ombra bianca diventa veramente visibile e rende il testo brutto.

Qualcuno sa come rimuovere l'ombra prima che venga applicato lo stile di selezione di celle predefinito?

ho provato:

  1. Utilizzando -tableView:willSelectRowAtIndexPath: di disinserire l'ombra con cell.textLabel.shadowColor = nil, ma questo non funziona nel tempo - l'ombra diventa non impostato solo dopo l'applicazione di selezione stile blu.
  2. Controllare cell.selected in tableView:cellForRowAtIndexPath: prima di impostare l'ombra ma questo ovviamente non funziona poiché la cella non viene ridisegnata dopo una selezione.

Ho anche provato a sovrascrivere il metodo delegato -tableView:willDisplayCell:forRowAtIndexPath: come suggerito da Kevin in basso. Dalle istruzioni di registrazione che ho inserito, questo metodo delegato viene chiamato solo poco prima che una cella venga disegnata: quando una cella viene toccata, è già troppo tardi. Questo è il codice che ho usato

(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]; 
    } 
} 

risposta

35

Un modo che dovrebbe funzionare è estendere UITableViewCell e sovrascrivere i metodi setSelected e setHighlighted, impostando lo stato dell'ombra esterna di conseguenza. Ciò assicurerà che sia dipinto contemporaneamente all'aggiornamento per evidenziare lo sfondo.

- (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

In realtà, potrebbe essere sufficiente eseguire l'override di setHighlighted: animato e non toccare setSelected: animato a tutti. Ci proverei prima. –

+0

Grazie Mike! Questo funziona perfettamente. –

+3

Posso confermare che è necessario eseguire l'override di entrambi. La cella viene evidenziata quando viene toccata, quindi selezionata quando alzi il dito verso l'alto. Se si esegue solo l'override di setHighlighted :, l'ombra riappare quando termina il tocco.Anche se si passa a un'altra vista dopo la selezione, è evidente. – benzado

3

Usa -tableView:willDisplayCell:forRowAtIndexPath:. Questa è l'ultima cosa che viene chiamata appena prima che la cella venga effettivamente visualizzata, quindi puoi interrogare la sua proprietà selected e impostare l'ombreggiatura del testo di conseguenza.

+2

Grazie Kevin. Ho letto la documentazione su questo punto dopo aver indicato '-tableView: willDisplayCell: forRowAtIndexPath:' out, e sembra che dovrebbe fare il trucco, ma non lo fa. Penso che '-tableView: willDisplayCell: forRowAtIndexPath:' viene chiamato quando la cella viene disegnata per la prima volta, e nel momento in cui una cella viene toccata, è già stata disegnata e quindi il metodo delegate non viene chiamato. Aggiornerò la mia domanda con il codice che ho provato Grazie ancora! –

+1

Ok, penso che la soluzione corretta sia quella di creare la propria sottoclasse UITableViewCell e sovrascrivere '-setSelected: animated:' lì per regolare l'ombra secondo necessità. –

3

Si dovrebbe ignorare tableView:willDisplayCell:forRowAtIndexPath: ed è necessario impostare il backgroundColor-[UIColor clearColor], anche, si dovrebbe agire solo sullo stato evidenziato, lo stato selezionato ha un significato leggermente diverso

2

credo che questo sia meglio:

- (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]; 
} 

Non ci sarà ombra durante le modifiche tra stati.

Problemi correlati