web-dev-qa-db-fra.com

Style de sélection personnalisé UITableViewCell?

Lorsque je clique sur ma UITableViewCell, la partie d’arrière-plan (les zones que mon image d’arrière-plan ne couvre pas) devient bleue lorsque je clique sur la cellule. En outre, toutes les UILabels de la cellule deviennent blanches lorsque vous cliquez dessus, ce que je veux.

Cependant, ce que je ne veux pas, c’est le fond bleu lorsque je clique dessus, mais si je fais selectionstylenone, je perds les couleurs surlignées pour les UILabels de la cellule.

Donc, y a-t-il un moyen de simplement supprimer le fond bleu lorsque la cellule est cliquée tout en conservant les couleurs surlignées du UILabels?

74
SimplyKiwi

Vous pouvez le faire comme suit. Définissez le style de sélection de votre cellule de table sur UITableViewCellSelectionStyleNone. Cela supprimera l'arrière-plan bleu en surbrillance. Ensuite, pour que la mise en surbrillance de l'étiquette de texte fonctionne comme vous le souhaitez, au lieu d'utiliser la classe UITableViewCell par défaut, créez une sous-classe de UITableViewCell et remplacez l'implémentation par défaut de setHighlighted:animated par votre propre implémentation qui définit les couleurs de l'étiquette comme vous le souhaitez état en surbrillance.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}
166
jonkroll

Si vous travaillez avant iOS7, définissez votre style de sélection de cellule

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Sinon, laissez-le par UITableViewCellSelectionStyleDefault

Ensuite:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

Ce code fonctionnera correctement

70
Alfa

Vous pouvez utiliser les méthodes de délégation suivantes après avoir défini le style de sélection sur none:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

Implémentez votre code ici, comme ceci

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}
16
Scar

Dans cellForRowAtIndexPath, utilisez ce code:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

J'espère que cela fonctionnera pour vous.

Profitez de la programmation :)

12
Mrunal

Pour obtenir ce travail, vous devez définir le style de sélection sur UITableViewCellSelectionStyleNone, puis redéfinir la méthode setSelected:animated: pour obtenir le résultat souhaité. Il fait la même chose que le mécanisme de sélection automatique d’iOS lorsque vous voyez la sélection bleue (ou grise). 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

Vous pouvez également personnaliser cela d'une autre manière, par exemple en changeant l'arrière-plan UITableViewCell, etc.

11
who9vy

Remplacer les fonctions suivantes dans votre sous-classe de UITableViewCell.

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
4
superarts.org

Afin de correspondre au comportement de style de sélection standard, vous souhaiterez remplacer setHighlighted:animated: et setSelected:animated:. Vous voudrez probablement déplacer ce code dans une méthode partagée afin d'éviter le code en double.

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

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

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}
2
Logan Gauthier

Dans votre cellule personnalisée, remplacez l'implémentation par défaut de awakeFromNib & setSelected: 

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

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

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

Assurez-vous également que le style de sélection estPASdéfini sur Aucun .

0
zeeawan

Le seul moyen de le faire fonctionner était de:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}
0
Fabricio PH

Aussi, vous pouvez utiliser contentView.alpha. Voici l'exemple.

Commencez par définir le style de sélection de votre cellule:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Ensuite, dans une classe de cellule personnalisée, remplacez cette méthode par un exemple d'animation:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
0
Alex Kolovatov