web-dev-qa-db-fra.com

Changer la couleur d'arrière-plan de la cellule sélectionnée?

Quelqu'un sait-il comment changer la couleur d'arrière-plan d'une cellule à l'aide de UITableViewCell, pour chaque cellule sélectionnée? J'ai créé cette UITableViewCell dans le code de TableView.

48
sg.

La modification de la propriété selectedBackgroundView est correcte et la manière la plus simple. J'utilise le code suivant pour changer la couleur de sélection:

// set selection color
UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1];
cell.selectedBackgroundView = myBackView;
[myBackView release];
92
Chilly Zhong

J'ai finalement réussi à faire fonctionner cela dans une vue de table avec un style défini sur Groupé.

Définissez d'abord la propriété selectionStyle de toutes les cellules sur UITableViewCellSelectionStyleNone.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Ensuite, implémentez les éléments suivants dans votre délégué de vue de table:

static NSColor *SelectedCellBGColor = ...;
static NSColor *NotSelectedCellBGColor = ...;

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow];
    if (currentSelectedIndexPath != nil)
    {
        [[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor];
    }

    return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor];
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.isSelected == YES)
    {
        [cell setBackgroundColor:SelectedCellBGColor];
    }
    else
    {
        [cell setBackgroundColor:NotSelectedCellBGColor];
    }
}
37
loomer
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [super setSelected:selected animated:animated];

    if (selected) {
        self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
    }
    else {
        self.backgroundColor = [UIColor clearColor];
    }
}
19
PK86

Swift 4, XCODE 9, IOS 11

Après quelques tests, cela [~ # ~] [~ # ~] supprimera la couleur d'arrière-plan lorsqu'il est désélectionné ou que la cellule est tapée une deuxième fois lorsque la vue de la table Sélection est réglé sur "Sélection multiple". Fonctionne également lorsque le style de vue tabulaire est défini sur "Groupé".

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.contentView.backgroundColor = UIColor.darkGray
        }
    }
}

Remarque: Pour que cela fonctionne comme vous le voyez ci-dessous, la propriété Selection de votre cellule peut être définie sur n'importe quoi MAIS Aucune.

A quoi cela ressemble avec différentes options

Style: Simple , Sélection: Sélection unique

Single Selection

Style: Simple , Sélection: Sélection multiple

Multiple Selection

Style: Groupé , Sélection: Sélection multiple

Grouped Multiple Selection

Bonus - Animation

Pour une transition de couleur plus fluide, essayez une animation:

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            UIView.animate(withDuration: 0.3, animations: {
                cell.contentView.backgroundColor = UIColor.darkGray
            })
        }
    }
}

Animated color transition

Bonus - Changement de texte et d'image

Vous pouvez remarquer que l'icône et la couleur du texte changent également lorsque la cellule est sélectionnée. Cela se produit automatiquement lorsque vous définissez les propriétés UIImage et UILabel Highlighted

UIImage

  1. Fournissez deux images en couleur:

Two colored images

  1. Définissez la propriété Image en surbrillance:

Highlighted property

UILabel

Fournissez simplement une couleur pour la propriété surlignée:

Highlighted Color

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

     UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
     cell.contentView.backgroundColor = [UIColor yellowColor];

}
11
Salim

J'ai créé UIView et défini la propriété de la cellule selectedBackgroundView:

UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
10
Yerkezhan

Si vous parlez de cellules sélectionnées, la propriété est -selectedBackgroundView. Cela sera affiché lorsque l'utilisateur sélectionnera votre cellule.

7
Steven Canfield

Pour iOS7 + et si vous utilisez Interface Builder alors sous-classe votre cellule et implémentez:

Objectif-C

- (void)awakeFromNib {
    [super awakeFromNib];
    // Default Select background
    UIView *v = [[UIView alloc] init];
    v.backgroundColor = [UIColor redColor];
    self.selectedBackgroundView = v;
}

Swift 2.2

override func awakeFromNib() {
    super.awakeFromNib()
    // Default Select background
    self.selectedBackgroundView = { view in
        view.backgroundColor = .redColor()
        return view
    }(UIView())
}
6
Peter Lapisu

J'ai un UITableViewCell hautement personnalisé. J'ai donc implémenté ma propre sélection de cellules.

cell.selectionStyle = UITableViewCellSelectionStyleNone;

J'ai créé une méthode dans la classe de ma cellule:

- (void)highlightCell:(BOOL)highlight
{
    if (highlight) {
        self.contentView.backgroundColor = RGB(0x355881);
        _bodyLabel.textColor = RGB(0xffffff);
        _fromLabel.textColor = RGB(0xffffff);
        _subjectLabel.textColor = RGB(0xffffff);
        _dateLabel.textColor = RGB(0xffffff);
    }
    else {
        self.contentView.backgroundColor = RGB(0xf7f7f7);;
        _bodyLabel.textColor = RGB(0xaaaaaa);
        _fromLabel.textColor = [UIColor blackColor];
        _subjectLabel.textColor = [UIColor blackColor];
        _dateLabel.textColor = RGB(0x496487);
    }
}

Dans ma classe UITableViewController de ViewWillAppear, j'ai ajouté ceci:

NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];

Dans didSelectRow a ajouté ceci:

SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
6
wzbozon

J'ai eu de la chance avec ce qui suit:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    bool isSelected = // enter your own code here
    if (isSelected)
    {
        [cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]];
        [cell setAccessibilityTraits:UIAccessibilityTraitSelected];
    }
    else
    {
        [cell setBackgroundColor:[UIColor clearColor]];
        [cell setAccessibilityTraits:0];
    }
}
6
sehugg

J'ai pu résoudre ce problème en créant une sous-classe de UITableViewCell et en implémentant la méthode setSelected: animated:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if(selected) {
        [self setSelectionStyle:UITableViewCellSelectionStyleNone];
        [self setBackgroundColor:[UIColor greenColor]];
    } else {
        [self setBackgroundColor:[UIColor whiteColor]];
    }
}

L'astuce consistait à

cell.selectionStyle = UITableViewCellSelectionStyleDefault;

dans le contrôleur de vue d'implémentation, puis dans la tableViewCell en le définissant comme

[self setSelectionStyle:UITableViewCellSelectionStyleNone];

J'espère que cela t'aides. :)

5
illuminate

Si vous souhaitez simplement supprimer la couleur de fond grise, procédez comme suit:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}     
5
Coolsinus

Cela fonctionnait parfaitement avec les appels groupés: implémentez une sous-classe personnalisée de UITableViewCell

Cela respectera les coins et autres ...

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
        [self setBackgroundColor:[UIColor colorWithRed:(245/255.0) green:(255/255.0) blue:(255/255.0) alpha:1]];
    else
        [self setBackgroundColor:[UIColor whiteColor]];

}
5
theprojectabot

Le style par défaut est gris et il détruit les couleurs de la cellule s'il a été fait par programme. Vous pouvez le faire pour éviter cela. (en Swift)
cell.selectionStyle = .None

4
726a

in Swift 3, converti à partir de la réponse illuminée.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    if(selected) {
        self.selectionStyle = .none
        self.backgroundColor = UIColor.green
    } else {
        self.backgroundColor = UIColor.blue
    }
}

(cependant la vue ne change qu'une fois la sélection confirmée en relâchant votre doigt)

3
Peter Johnson

Consultez AdvancedTableViewCells in exemple de code Apple .

Vous voudrez utiliser le modèle de cellule composite.

3
johndpope

Dans Swift

let v = UIView()
    v.backgroundColor = self.darkerColor(color)
    cell?.selectedBackgroundView = v;

...

func darkerColor( color: UIColor) -> UIColor {
    var h = CGFloat(0)
    var s = CGFloat(0)
    var b = CGFloat(0)
    var a = CGFloat(0)
    let hueObtained = color.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    if hueObtained {
        return UIColor(hue: h, saturation: s, brightness: b * 0.75, alpha: a)
    }
    return color
}
3
Alexander Volkov

Travaille pour moi

UIView *customColorView = [[UIView alloc] init];
    customColorView.backgroundColor = [UIColor colorWithRed:180/255.0 
                                                      green:138/255.0 
                                                       blue:171/255.0 
                                                      alpha:0.5];
    cell.selectedBackgroundView =  customColorView;
2
Mrsantateam

Créez un UITableViewCell personnalisé. À l'intérieur de votre classe personnalisée, remplacez la fonction "setSelected" et modifiez la couleur d'arrière-plan contentView. Vous pouvez également remplacer votre fonction "setHighlighted".

Dans Swift:

class myTableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }

    override func setHighlighted(highlighted: Bool, animated: Bool) {
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }
}
2
Eduardo Irias
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.contentView.backgroundColor = .black
    } else {
        self.contentView.backgroundColor = .white
    }
}
1
Daniel Simons

Voici un moyen rapide de le faire directement dans Interface Builder (dans un Storyboard). Faites glisser une simple UIView en haut de votre UITableView comme dans UIView Connectez ensuite la prise selectedBackgroundView de votre cellule à cette vue. Vous pouvez même connecter plusieurs prises de cellules à cette vue. Cell's outlet

1
Sebastian
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor yellowColor];
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = nil;
}
1
tuoxie007

Pour une solution qui fonctionne (correctement) avec UIAppearance pour iOS 7 (et supérieur?) En sous-classant UITableViewCell et en utilisant sa valeur par défaut selectedBackgroundView pour définir la couleur, jetez un œil à ma réponse à une question similaire ici .

1
anneblue

J'ai essayé chacune des réponses ci-dessus, mais aucune ne me convient le mieux,

alors j'ai examiné l'une des méthodes natives fournies, et cela fonctionne très bien.

tout d'abord, définissez cellSelectionStyle sur None, puis optez pour cette solution.

func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?
{   
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting deselected, make whatever changes that are required to make it back normal        

    cell.backgroundColor = kNormalColor;

    return indexPath;
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting selected, make whatever changes that are required to make it selected        

    cell.backgroundColor = kSelectedColor;

    return indexPath;
}

l'avantage de ces méthodes sur les autres est:

  1. Cela fonctionne pour la sélection de plusieurs cellules
  2. Vous pouvez modifier n'importe quel élément, comme vous le souhaitez, non seulement la couleur d'arrière-plan de la cellule donnée lorsqu'elle est sélectionnée ou désélectionnée.
0
Mehul Thakkar

Swift 3, 4, 5 sélectionnez la couleur d'arrière-plan des cellules

1) Modifiez uniquement la couleur en surbrillance lorsque l'utilisateur clique sur la cellule:

1.1) Classe de cellule intérieure:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.init(white: 1.0, alpha: 0.1)
    selectedBackgroundView = backgroundView
}

1.2) Viewcontroller que vous utilisez une cellule personnalisée

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

2) Si vous définissez la couleur des cellules sélectionnées:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state

    if selected {
        self.backgroundColor = .darkGray
    } else {
        self.backgroundColor = .white
    }
}
0
Doca
var last_selected:IndexPath!

définir last_selected: IndexPath dans la classe

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! Cell
    cell.contentView.backgroundColor = UIColor.lightGray
    cell.txt.textColor = UIColor.red

    if(last_selected != nil){
        //deselect
        let deselect_cell = tableView.cellForRow(at: last_selected) as! Cell
        deselect_cell.contentView.backgroundColor = UIColor.white
        deselect_cell.txt.textColor = UIColor.black
    }

    last_selected = indexPath
}
0
Talha Ahmed