Comment changer la couleur de surbrillance bleue d'un UITableViewCell?

131

Je me demande comment changer la couleur de surbrillance / sélection bleue d'un UITableViewCell, des idées?

Thomas Joos
la source

Réponses:

213

Vous pouvez modifier la couleur de surbrillance de plusieurs manières.

  1. Modifiez la propriété selectionStyle de votre cellule. Si vous le remplacez par UITableViewCellSelectionStyleGray, il sera gris.

  2. Changez la selectedBackgroundViewpropriété. En fait, ce qui crée le dégradé bleu est une vue. Vous pouvez créer une vue et dessiner ce que vous voulez et utiliser la vue comme arrière-plan de vos cellules de vue de tableau.

zonble
la source
8
cool, a trouvé une bonne explication et un exemple ici: cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Thomas Joos
1
J'ai réalisé que dans IB, vous ne pouvez pas définir la "Sélection" UITableViewCell sur "Aucun" - parce que selectedBackgroundViewcela n'apparaîtra alors tout simplement jamais. Ce n'est qu'après avoir réglé "Sélection" sur Default, le selectedBackgroundViewshow up. Testé sur iOS 6 et 7.
Jonny
12
Merci pour la bonne note! Cela rend les choses tellement simples maintenant: vous créez une nouvelle vue (pas besoin même de spécifier le cadre: cell.selectedBackgroundView = [UIView new];et vous définissez la couleur que vous voulez:cell.selectedBackgroundView.backgroundColor = [UIColor colorWithHex:@"ecf2f5" andAlpha:1];
Dannie P
regardez en bas de cette page, il y a des approches plus récentes
Grimper le
144

Zonble a déjà fourni une excellente réponse. J'ai pensé qu'il pourrait être utile d'inclure un court extrait de code pour ajouter un UIViewà la cellule de vue du tableau qui se présentera comme vue d'arrière-plan sélectionnée.

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    UIView *selectionColor = [[UIView alloc] init];
    selectionColor.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1];
    cell.selectedBackgroundView = selectionColor;
  • la cellule est ma UITableViewCell
  • J'ai créé un UIView et défini sa couleur d'arrière-plan en utilisant des couleurs RVB (gris clair)
  • J'ai ensuite défini la cellule selectedBackgroundViewpour qu'elle soit celle UIViewque j'ai créée avec la couleur de fond choisie

Cela a bien fonctionné pour moi. Merci pour le conseil Zonble.

T Davey
la source
2
Cela ne fonctionne pas très bien lorsque vous utilisez des vues de table avec des sections. Lorsqu'elle est sélectionnée, la cellule perdra les bordures et n'est pas arrondie lorsque la première ou la dernière cellule.
Kirk Woll
7
@kirk, vous voulez dire groupé :)
Tieme
@Tieme, non, je veux dire des sections : "Une vue de table est composée de zéro ou plusieurs sections, chacune avec ses propres lignes."
Kirk Woll
Vous devez le placer dans le 'cellForRowAtIndexPath'. Fonctionne bien pour moi, avec une section. Je ne l'ai pas essayé avec plusieurs sections.
Vincent
Un peu tard dans le jeu mais je peux confirmer que cela fonctionne dans une vue de table avec plusieurs sections (non groupées)
matto0
30

UITableViewCell a trois styles de sélection par défaut: -

  1. Bleu
  2. gris
  3. Aucun

La mise en œuvre est la suivante: -

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

     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];       
}
Arshad Parwez
la source
7
plutôt que ces trois styles par défaut, nous pouvons également personnaliser le style attendu par la propriété selectedBackgroundView.
Sunil Targe
A travaillé pour moi ... Merci beaucoup.
Mujeeb Farooqi
19

Dans Swift, utilisez ceci dans cellForRowAtIndexPath

let selectedView = UIView()
selectedView.backgroundColor = .white
cell.selectedBackgroundView = selectedView

Si vous souhaitez que la couleur de votre sélection soit la même dans tous les domaines UITableViewCell, utilisez-la dans AppDelegate.

let selectedView = UIView()
selectedView.backgroundColor = .white
UITableViewCell.appearance().selectedBackgroundView = selectedView
alitosuner
la source
18

Si vous souhaitez le modifier à l'échelle de l'application, vous pouvez ajouter la logique à votre délégué d'application

class AppDelegate: UIResponder, UIApplicationDelegate {

    //... truncated

   func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

        // set up your background color view
        let colorView = UIView()
        colorView.backgroundColor = UIColor.yellowColor()

        // use UITableViewCell.appearance() to configure 
        // the default appearance of all UITableViewCells in your app
        UITableViewCell.appearance().selectedBackgroundView = colorView

        return true
    }

    //... truncated
}
NatashaTheRobot
la source
Parfait. Une idée comment définir la couleur du texte de cette cellule par défaut globalement lors de la sélection?
BananaAcid
1
cela fonctionne, mais la sélection est effacée directement lorsque vous appuyez sur le nouveau contrôleur de vue.
bobmoff
Belle façon d'apporter des changements globaux à UITableViewCell
Shashi3456643
12

par souci d'exhaustivité: si vous avez créé votre propre sous-classe de, UITableViewCellvous pouvez implémenter la - (void)setSelected:(BOOL)selected animated:(BOOL)animatedméthode et définir la couleur d'arrière-plan d'une vue que vous avez ajoutée dans la vue de contenu. (si tel est le cas) ou du contentView lui-même (s'il n'est pas couvert par l'une de vos propres vues.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if(selected) {
        self.contentView.backgroundColor = UIColor.blueColor;
    } else {
        self.contentView.backgroundColor = UIColor.whiteColor;
    }
}

(n'a pas utilisé? pour s'adapter à la petite largeur du code source DIV's :)

cette approche présente deux avantages par rapport à l'utilisation de selectedBackgroundView, elle utilise moins de mémoire et un peu moins de CPU, non pas que vous le remarqueriez même à moins d'afficher des centaines de cellules.

Martijn Scheffer
la source
Cela ne fonctionne qu'après une nouvelle vue assignée au selectedBackgroundView Au tout début de la méthode addself. selectedBackgroundView = [UIView new];
enadun
@enadun Cette méthode fonctionne pour moi sur iOS 12, sans aucun réglage de la selectedBackgroundViewpropriété.
Nate
11

Je dois définir le style de sélection sur UITableViewCellSelectionStyleDefaultpour que la couleur d'arrière-plan personnalisée fonctionne. S'il s'agit d'un autre style, la couleur d'arrière-plan personnalisée sera ignorée. Testé sur iOS 8.

Le code complet de la cellule comme suit:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];

    return cell;
}
samwize
la source
6

En fonction de la réponse de @utilisateur , vous pouvez simplement ajouter cette extension n'importe où dans le code de votre application et avoir la couleur de votre sélection directement dans l'éditeur de storyboard pour toutes les cellules de votre application:

@IBDesignable extension UITableViewCell {
    @IBInspectable var selectedColor: UIColor? {
        set {
            if let color = newValue {
                selectedBackgroundView = UIView()
                selectedBackgroundView!.backgroundColor = color
            } else {
                selectedBackgroundView = nil
            }
        }
        get {
            return selectedBackgroundView?.backgroundColor
        }
    }
}

Couleur de sélection UITableViewCell dans le storyboard

Grimper
la source
5
@IBDesignable class UIDesignableTableViewCell: UITableViewCell {
  @IBInspectable var selectedColor: UIColor = UIColor.clearColor() {
    didSet {
      selectedBackgroundView = UIView()
      selectedBackgroundView?.backgroundColor = selectedColor
    }
  }
}

Dans votre storyboard, définissez la classe de votre UITableViewCell sur UIDesignableTableViewCell, dans l'inspecteur d'attributs, vous pouvez changer la couleur sélectionnée de votre cellule en n'importe quelle couleur.

Vous pouvez l'utiliser pour toutes vos cellules. Voici à quoi ressemblera votre inspecteur d'attributs.

Voici à quoi ressemblera votre inspecteur d'attributs

utilisateur
la source
Très créatif! génial!
Kaushil Ruparelia
vous pouvez le rendre encore plus simple, regardez ma réponse;) stackoverflow.com/a/51764804/537694
Climbatize
J'utilise une cellule personnalisée pour définir les étiquettes, donc cela fonctionne bien, merci! Changement pour Swift 5: c'est maintenant UIColor.clear, non UIColor.clearColor(). Je ne sais pas si c'est un changement dans Swift aussi, mais cela fonctionne également sans @IBDesignable.
Neph
5

Swift 3.0 / 4.0

Si vous avez créé votre propre cellule personnalisée, vous pouvez modifier la couleur de sélection awakeFromNib()pour toutes les cellules:

 override func awakeFromNib() {
    super.awakeFromNib()

    let colorView = UIView()
    colorView.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

    self.selectedBackgroundView = colorView


}
Sam Bing
la source
0

1- Ajoutez une vue à la vue de contenu de votre cellule.
2- Faites un clic droit sur votre cellule.
3- Faire la vue ajoutée comme "selectedBackgroundView" entrez la description de l'image ici

Badr
la source