2008-11-04 8 views
35

Sto sviluppando un'applicazione per iPhone, a mio avviso tabella volevo colore personalizzato per stile di cella di selezione, ho letto la UITableViewCell Classe di riferimento ma ci sono solo tre costanti definite per lo stile di selezione (blu, grigio, None). Ho visto un'applicazione che utilizzava un colore diverso da quelli definiti nel riferimento.Come si imposta la proprietà UITableViewCellSelectionStyle su un colore personalizzato?

Come è possibile utilizzare un colore diverso da quelli definiti nel riferimento?

Grazie in anticipo.

+0

Consiglio vivamente l'approccio di Matt Gallagher rispetto a quello che hai accettato! Ti preghiamo di dare un'occhiata se non l'hai già fatto. –

+0

Le risposte in questo post sono così incasinate. Tutti si prega di ignorare quelli più votati e andare a votare le risposte corrette corrette, che sono in fondo. – bentford

risposta

64

Il modo migliore per impostare la selezione è impostare selectedBackgroundView sulla cella quando lo si costruisce.

cioè

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; 
    } 

    // configure the cell 
} 

L'immagine utilizzata dovrebbe avere una bella pendenza (come la selezione di default). Se desideri solo un colore piatto, puoi utilizzare un UIView anziché uno UIImageView e impostare lo backgroundColor sul colore desiderato.

Questo sfondo viene quindi applicato automaticamente quando viene selezionata la riga.

+5

E per le viste in tabelle di stile raggruppate? Ho appena usato un'immagine del rettangolo e ha mostrato attraverso le curve arrotondate delle celle tableview. +1 per un'ottima risposta. – JoePasq

+3

Per le celle tableview raggruppate sono necessari 4 sfondi: alto, basso, medio e alto e basso e occorre applicarli in base a dove si trova la cella nel gruppo. –

+0

Non puoi farlo senza usare le immagini? –

2

Ignora didSelectRowAtIndexPath: disegna un UIView di un colore a tua scelta e inseriscilo dietro l'UILabel all'interno della cella. Lo farei qualcosa di simile:

UIView* selectedView; //inside your header 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; 
    selectedView = [[UIView alloc] initWithFrame:[cell frame]]; 
    selectedView.backgroundColor = [UIColor greenColor]; //whatever 

    [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary 
    [selectedView release]; //clean up 

} 

Si può scegliere di animare questo punto di vista fuori quando viene deselezionata e in grado di soddisfare le vostre esigenze.

+8

Questo approccio evita la selezione diBackgroundView di Apple integrata su ogni UITableViewCell. Se si utilizza la Vista selezionata, la selezione si animerà dentro e fuori e verrà anche deselezionata quando richiesto. –

+1

Sarebbe meglio sovrascrivere 'setSelected: evidenziato:' nella cella e fare la logica lì se si sta andando a prendere questo approccio in modo che funzioni in tutti i controller di vista. Come ha detto Matt, usare 'selectedBackgroundView' è un approccio molto migliore. –

+0

+1 Buona risposta, anche se un po 'hacky. Non è una brutta cosa! – bentford

24

L'impostazione di selectedBackgroundView sembra non avere alcun effetto quando lo cell.selectionStyle è impostato su UITableViewCellSelectionStyleNone. Quando non imposto lo stile è solo il grigio predefinito.

Utilizzando il primo suggerimento che inserisce l'usanza UIView nella cella non manipolare il cellulare, ma non visualizzato quando si tocca la cella, solo dopo l'azione selezionata è stata completata che è troppo tardi, perché sto spingendo a una nuova visione Come posso ottenere la visualizzazione selezionata nella cella da visualizzare prima dell'inizio dell'operazione selezionata?

+1

Ciò richiede più upvotes. – freespace

+4

Questo è corretto. Devo impostare selectionStyle su Blur o Gray. Nessuno lo farà non funziona. In ogni caso puoi farlo sovrascrivendo il metodo '-setHighlited: animated:' della classe 'UITableViewCell'. – Eonil

+1

-1 Questo dovrebbe essere un commento. – bentford

7

Ho provato alcuni di quanto sopra, e realtà preferisco creare il mio sottoclasse di UITableViewCell e poi sostituire le/touchesCancelled/touchesEnded metodi touchesBegan. Per fare ciò, ignora tutte le proprietà SelectedBackgroundView e highlightColor sulla cella, e invece imposta questi colori manualmente ogni volta che uno dei metodi sopra indicati viene chiamato. Ad esempio, se si desidera impostare il cellulare per avere uno sfondo verde con testo rosso, provate questo (all'interno della sottoclasse cella personalizzato):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //Set backgorund 
    self.backgroundColor = [UIColor themeBlue]; 

    //Set text 
    self.textLabel.textColor = [UIColor themeWhite]; 

    //Call super 
    [super touchesBegan:touches withEvent:event]; 
} 

Si noti che per questo lavoro, è necessario impostare:

self.selectionStyle = UITableViewCellSelectionStyleNone; 

Altrimenti, per prima cosa si ottiene lo stile di selezione corrente.

EDIT: Suggerisco utilizzando il metodo touchesCancelled per ripristinare i colori originali delle cellule, ma semplicemente ignorare il metodo touchesEnded.

+0

+1 Buona risposta! – bentford

12

Se avete sottoclasse un UITableViewCell, allora è possibile personalizzare i vari elementi della cellula sovrascrivendo il seguente:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

EDIT per iOS7: come detto Sasho, è inoltre necessario

cell.selectionStyle = UITableViewCellSelectionStyleNone 
+0

+1 Buona risposta, questo ha risolto il mio problema. Grazie! – bentford

+0

In iOS 7 la soluzione di cui sopra ha funzionato in combinazione con "cell. SelectionStyle = UITableViewCellSelectionStyleNone". – Sasho

1

Sublcass UITableViewCell e sovrascrivere setHighlighted:animated:

è possibile definire un colore personalizzato selezione impostando il backgroundColor (vedi risposta di WIllster):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

È possibile definire un'immagine di sfondo personalizzata impostando la proprietà backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted == YES) 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; 
    else 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; 


    [super setHighlighted:highlighted animated:animated]; 
} 
0
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
// Set Highlighted Color 
if (highlighted) { 
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
} 
+0

UITableViewCell ha il metodo per impostare il colore dello stato evidenziato Qui, il codice spinnet // anima tra lo stato normale e evidenziato – PK86

0
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Add your Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour 
} 

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reset Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color 

} 

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { 
    cell.contentView.backgroundColor = color; 
    cell.backgroundColor = color; 
} 
0

Per aggiungere un colore personalizzato utilizzare il codice qui sotto . E per rendere uso trasparente alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero) 
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0) 

Se si utilizza il colore personalizzato e si vuole dare arrotondato angolo utilizzo aspetto:

cell.layer.cornerRadius = 8 

Inoltre, utilizzare questo per una migliore animazione e si sentono

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    tableView.deselectRow(at: indexPath, animated: true) 
}