38 votes

UITableViewCell : Comment empêcher l'arrière-plan bleu de la sélection sans modifier la propriété isSelected ?

Je dispose d'une UITableViewCell sous-classe. J'ai défini le contentView de ma sous-classe de cellule à d'une UIView dans laquelle je surcharge la classe -drawRect: et faire tout le dessin là-bas.

De plus, je mets cell.contentView.opaque = NO afin d'obtenir la transparence dans certaines zones de la cellule (malheureusement, une image de fond derrière la table doit apparaître à travers chaque cellule dans certaines parties pour obtenir un effet stylistique. je sais que c'est un problème de performance. il doit en être ainsi).

Problème : je vois toujours le joli fond bleu dégradé par défaut se dessiner derrière ma cellule (dans les zones transparentes) lorsqu'elle est sélectionnée ou mise en évidence (en appuyant dessus). Cela masque l'image derrière le tableau, ce qui est mauvais.

Objectif : empêcher l'apparition de l'arrière-plan bleu dégradé, tout en étant en mesure d'inspecter l'écran de l'ordinateur. cell.isSelected y cell.isHighlighted les propriétés de l'intérieur -[MyContentView drawRect:] pour déterminer comment dessiner ma propre sélection/mise en évidence personnalisée.

Ce que j'ai essayé :

  1. paramètre cell.selectionStyle = UITableViewCellSelectionStyleNone a l'effet désiré d'empêcher l'apparition d'un joli fond de sélection en gradient bleu, mais empêche également l'utilisation de la fonction cell.isSelected y cell.isHighlighted ne sont pas correctement définies, ce qui signifie que je ne peux pas faire ma propre sélection personnalisée/le dessin en surbrillance.

  2. réglage cell.selectionBackgroundView = nil y cell.backgroundView = nil dans la cellule -init o -prepareForReuse n'empêche pas l'arrière-plan de sélection du gradient bleu

  3. réglage cell.selectionBackgroundView = nil en el -[MyContentView -drawRect:] méthode fait ont l'effet désiré d'empêcher l'arrière-plan de sélection du gradient bleu, mais cela semble très peu pratique

  4. Le remplacement de -[UITableViewCell setSelected:animated :] par un no-op. Cela n'a pas l'effet désiré d'empêcher l'arrière-plan de sélection en dégradé bleu.

68voto

jessecurry Points 12114

Vous devez également remplacer setHighlighted : pour éviter que le dégradé de bleu n'apparaisse. Si vous ne faites que remplacer setHighlighted :, vous obtiendrez un effet de sélection momentané.

donc vous aurez ces deux méthodes :

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

61voto

Mugunth Points 8671
cell.selectionStyle = UITableViewCellSelectionStyleNone;

47voto

Jason Points 11332

Une excellente ressource sur la personnalisation des UITableViews est la suivante ce poste par Matt Gallagher. Ce que vous voulez faire, c'est définir la selectedBackgroundView sur une nouvelle vue (au lieu de nil) qui est soit transparente, soit une UIImageView.

1voto

Max MacLeod Points 8425

À mon avis, la méthode la plus simple pour y parvenir est de cocher la case des attributs de l'affichage du tableau dans l'écran de création d'interface, à l'endroit où il est indiqué "Afficher la sélection au toucher". Voir la capture d'écran ci-dessous :

enter image description here

-1voto

Ce qui a fonctionné pour moi dans le passé, c'est simplement de mettre :

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

Dans mes sous-classes UITableViewCell (parce qu'elles n'appellent pas super et ne se mettent pas en évidence). J'espère que c'est ce que vous recherchiez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X