2009-05-22 6 views
38

Ho una sottoclasse personalizzata UITableViewCell. Ho impostato il contentView della mia sottoclasse di celle su una classe personalizzata UIView in cui sto ignorando -drawRect: e faccio tutto il disegno lì.UITableViewCell: come evitare lo sfondo blu di selezione senza il borking è proprietà selezionata?

Inoltre, sto impostando cell.contentView.opaque = NO per ottenere la trasparenza in alcune aree della cella (sfortunatamente un'immagine dietro al tavolo deve mostrare attraverso ogni cella in determinate parti per ottenere un effetto stilistico. colpire, deve essere così).

Problema: continuo a vedere il bellissimo sfondo sfumato blu predefinito disegnato dietro la mia cella (nelle aree trasparenti) quando è selezionato o evidenziato (premuto). Questo sta oscurando l'immagine dietro il tavolo, che è male.

Obiettivo: evitare che il gradiente di sfondo blu di apparire, ma ancora in grado di ispezionare i cell.isSelected e cell.isHighlighted oggetti di entro -[MyContentView drawRect:] per determinare come disegnare la mia selezione custom/evidenziazione.

Quello che ho provato:

  1. impostazione cell.selectionStyle = UITableViewCellSelectionStyleNone ha l'effetto desiderato di impedire la bella sfondo blu selezione di pendenza, ma impedisce anche le proprietà cell.isSelected e cell.isHighlighted di essere impostato correttamente, il che significa che non posso fare mia selezione custom/disegno

  2. clou impostazione cell.selectionBackgroundView = nil e cell.backgroundView = nil nel metodo -init o -prepareForReuse della cellula non impedisce la selezione blu sfumato indietro terra

  3. impostazione cell.selectionBackgroundView = nil nel metodo -[MyContentView -drawRect:]fa avere l'effetto desiderato di impedire la selezione di sfondo blu sfumato, ma che sembra molto janky

  4. imperativa - [UITableViewCell setSelected: animato:] per essere un no -operazione. questo non ha l'effetto desiderato di impedire la selezione blu sfumato sfondo

risposta

47

Una risorsa eccellente sulla personalizzazione UITableViews è stato this post da Matt Gallagher. Quello che vorrai fare è impostare il SelectedBackgroundView su una nuova vista (invece di nil) che sia trasparente o UIImageView.

+0

Jason, grazie! il tuo suggerimento ha fatto il trucco. un paio di note: - Non sono sicuro di come hai raccolto quelle informazioni dall'articolo in quanto non era uno dei punti significativi fatti. ma buon lavoro :) - quell'articolo è def molto informativo. Purtroppo, sembra anche un litle fuorviante in quanto ignora il caso comune in cui u bisogno di una maggiore personalizzazione delle cellule in questo caso è meglio sottoclasse e sovrascrivere -drawRect del contentView: per ottenere lo scorrimento veloce come spiegato qui: http: // blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ –

+9

Giusto per chiarire ulteriormente questo aspetto per i futuri lettori, invece di impostare qualsiasi cella.selectionStyle, imposta cell.selectedBackgroundView su UIView - I set a un UIView con gli stessi limiti della mia cella, quindi imposta alpha su 0.5 per evidenziare la cella ma lascia comunque tutto visibile. Non dimenticare di chiamare [self setNeedsDisplay] nel tuo metodo setSelected! –

+0

Tutto @KendallHelmstetterGelner con questo metodo funziona, tranne che nonostante l'impostazione 'alpha' a 0,5 e chiamando' setNeedsDisplay', il colore di sfondo selezionato è completamente bianco e copre vista della cellula quando selezionato (nonostante aver impostato il 'UIView' /' selectedBackgroundView'' s colore di sfondo per 'clearColor'). Qualche idea? – sooper

-1

Che cosa ha funzionato per me in passato è solo mettere:

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

Nei miei sottoclassi UITableViewCell (perché non chiamerà super e farsi evidenziato). Spero che questo sia quello che stavi cercando.

+0

thx Joe, ma ho provato e che non impedisce il blu sfumato seletion sfondo –

+0

ho modificato la mia Q sopra per includere che ho provato questo e non ho avuto l'effetto desiderato –

68

È inoltre necessario eseguire l'override di setHighlighted: per evitare che il gradiente blu venga visualizzato. Se si esegue l'override di setHighlighted: si finisce con un effetto di selezione momentaneo.

quindi dovrete questi due metodi:

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

Questa è di gran lunga la migliore risposta. Più persone hanno bisogno di revocarlo. – samvermette

+1

@sam Concordato. Questo metodo funziona solo se hai una sottoclasse UITableViewCell (che la domanda originale menziona) e secondo me è la soluzione migliore. – BLeB

+0

Devo decommentare [super setSelected: selected animated: animated] per far funzionare isSelected property. – angelokh

61
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
+2

ero alla ricerca di questo. Grazie! – Oscar

+1

Funziona semplicemente. Grazie! – saimonx

+1

Questo funziona. –

-12

ne dici di questo?

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

odieranno – Andy

+0

+1 per un commento esilarante! lol – Pavan

1

Di gran lunga il metodo più semplice - a mio parere - per raggiungere questo obiettivo, è impostando il Table View attributi casella di controllo nella schermata di Interface Builder in cui si dice "Mostra selezione su touch". Vedere la schermata qui sotto:

enter image description here

+2

Deselezionando questa opzione sembra avere alcun effetto. Tuttavia, ho appena trovato una soluzione alternativa che ho pubblicato su http://stackoverflow.com/a/22936734/804616 – trss

Problemi correlati