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 UILabel
s 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 UILabel
s 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 UILabel
s?
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];
}
}
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
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;
}
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 :)
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.
Remplacer les fonctions suivantes dans votre sous-classe de UITableViewCell
.
override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }
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()
}
}
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 .
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;
}
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;
}];
}
}