35 votes

Comment définir la propriété UITableViewCellSelectionStyle avec une couleur personnalisée ?

Je développe une application iPhone, dans ma vue de tableau je voulais une couleur personnalisée pour le style de sélection de cellule, j'ai lu le Référence de la classe UITableViewCell mais il n'y a que trois constantes définies pour le style de sélection (Bleu, Gris, Aucun). J'ai vu une application qui utilisait une couleur différente de celles définies dans la référence.

Comment utiliser une couleur autre que celles définies dans la référence ?

0 votes

Je recommande vivement l'approche de Matt Gallagher plutôt que celle que vous avez acceptée ! N'hésitez pas à y jeter un coup d'œil si vous ne l'avez pas encore fait.

0 votes

Les réponses à ce post sont tellement erronées. Tout le monde est prié d'ignorer les réponses les mieux notées et de voter pour les réponses correctes, qui se trouvent en bas de page.

64voto

Matt Gallagher Points 10431

La meilleure façon de définir la sélection est de définir le paramètre selectedBackgroundView sur la cellule lorsque vous la construisez.

c'est-à-dire

- (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'image utilisée doit avoir un beau dégradé (comme la sélection par défaut). Si vous souhaitez simplement une couleur plate, vous pouvez utiliser une UIView au lieu d'une UIImageView et définir le backgroundColor à la couleur souhaitée.

Cet arrière-plan est ensuite automatiquement appliqué lorsque la ligne est sélectionnée.

5 votes

Qu'en est-il des vues de tableaux groupés ? J'ai utilisé une image rectangulaire et elle est apparue à travers les courbes arrondies des cellules de la vue de tableau. +1 pour une excellente réponse.

3 votes

Pour les cellules de tableview groupées, vous avez besoin de 4 arrière-plans - haut, bas, milieu et haut et bas - et vous devez les appliquer en fonction de l'endroit où se trouve la cellule dans le groupe.

0 votes

Ne pouvez-vous pas le faire sans utiliser d'images ?

24voto

Paul Points 239

Réglage de la selectedBackgroundView semble n'avoir aucun effet lorsque le cell.selectionStyle est fixé à UITableViewCellSelectionStyleNone . Lorsque je ne définis pas le style, il utilise le gris par défaut.

En utilisant la première suggestion qui insère le UIView dans la cellule manipule effectivement la cellule mais ne s'affiche pas lorsque la cellule est touchée, seulement après que l'action sélectionnée soit terminée, ce qui est trop tard car je suis en train de passer à une nouvelle vue. Comment faire pour que la vue sélectionnée dans la cellule s'affiche avant le début de l'opération sélectionnée ?

4 votes

C'est exact. Je dois définir selectionStyle sur Blur ou Gray. Aucun ne fonctionnera. Quoi qu'il en soit, vous pouvez le faire en remplaçant -setHighlited:animated: méthode de UITableViewCell classe.

13voto

Willster Points 1458

Si vous avez sous-classé une cellule UITableViewCell, vous pouvez personnaliser les différents éléments de la cellule en surchargeant les éléments suivants :

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

    [super setHighlighted:highlighted animated:animated];
}

EDIT pour iOS7 : comme l'a indiqué Sasho, vous avez également besoin de

cell.selectionStyle = UITableViewCellSelectionStyleNone

0 votes

Dans iOS 7, la solution ci-dessus fonctionnait en combinaison avec "cell. selectionStyle = UITableViewCellSelectionStyleNone".

7voto

Charles Marsh Points 864

J'ai essayé certaines des solutions ci-dessus, et En fait, je préfère créer ma propre sous-classe de UITableViewCell et surcharger les méthodes touchesBegan/touchesCancelled/touchesEnded. . Pour ce faire, ignorez toutes les propriétés selectedBackgroundView et highlightedColor de la cellule, et définissez plutôt ces couleurs manuellement chaque fois que l'une des méthodes ci-dessus est appelée. Par exemple, si vous souhaitez que la cellule ait un arrière-plan vert avec un texte rouge, essayez ceci (dans votre sous-classe de cellule personnalisée) :

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

Notez que pour que cela fonctionne, vous devez définir :

self.selectionStyle = UITableViewCellSelectionStyleNone;

Sinon, vous obtiendrez d'abord le style de sélection actuel.

EDIT : Je suggère d'utiliser la méthode touchesCancelled pour revenir aux couleurs originales des cellules, mais d'ignorer la méthode touchesEnded.

2voto

Jeffrey Forbes Points 592

Surchargez didSelectRowAtIndexPath : et dessinez une UIView d'une couleur de votre choix et insérez-la derrière l'UILabel à l'intérieur de la cellule. Je ferais quelque chose comme ça :

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

}

Vous pouvez choisir d'animer cette vue lorsqu'elle est désélectionnée, ce qui répondra à vos besoins.

8 votes

Cette approche permet d'éviter le selectedBackgroundView intégré d'Apple sur chaque UITableViewCell. Si vous utilisez selectedBackgroundView, votre sélection sera animée à l'intérieur et à l'extérieur et sera également désélectionnée lorsqu'on vous le demandera.

1 votes

Il serait préférable de remplacer setSelected:highlighted: dans la cellule et y appliquer la logique si vous adoptez cette approche pour qu'elle fonctionne dans tous les contrôleurs de vue. Comme Matt l'a dit, l'utilisation de selectedBackgroundView est une bien meilleure approche.

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