UITableViewCell rend l’arrière-plan de l’étiquette plus clair lorsqu’il est mis en évidence

J’ai un UIlabel sur un UITableViewCell, que j’ai créé par programmation (c’est-à-dire pas un nib ou une sous-classe).

Lorsque la cellule est mise en surbrillance (passe au bleu), toutes les couleurs d’arrière-plan des UILabels deviennent claires. J’ai 2 UILabels où je ne veux pas que ce soit le cas. Actuellement, j’utilise UIImageViews derrière les UILabel pour faire croire que la couleur d’arrière-plan ne change pas. Mais cela semble être un moyen inefficace de le faire.

Comment puis-je arrêter la modification de la couleur d’arrière-plan de UILabel lorsque UITableViewCell est en surbrillance?

Une autre façon d’empêcher la couleur d’arrière-plan de changer en surbrillance consiste à définir la propriété backgroundColor sur le layer de l’étiquette plutôt que sur l’étiquette elle-même.

 #import  

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Get a table cell UITableViewCell *cell = [tableView dequeueReusableCellForIdentifier:@"cell"]; // Set up the table cell cell.textLabel.text = @"This is a table cell."; // If you're targeting iOS 6, set the label's background color to clear // This must be done BEFORE changing the layer's backgroundColor cell.textLabel.backgroundColor = [UIColor clearColor]; // Set layer background color cell.textLabel.layer.backgroundColor = [UIColor blueColor].CGColor; return cell; } 

Le layer n’est pas affecté par la mise en surbrillance ou la sélection des cellules.

Vous devez sous-classer UITableViewCell et remplacer les deux méthodes suivantes:

Objectif c:

 - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { UIColor *backgroundColor = self.myLabel.backgroundColor; [super setHighlighted:highlighted animated:animated]; self.myLabel.backgroundColor = backgroundColor; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { UIColor *backgroundColor = self.myLabel.backgroundColor; [super setSelected:selected animated:animated]; self.myLabel.backgroundColor = backgroundColor; } 

Rapide

 override func setSelected(selected: Bool, animated: Bool) { let color = self.myLabel.backgroundColor super.setSelected(selected, animated: animated) self.myLabel.backgroundColor = color } override func setHighlighted(highlighted: Bool, animated: Bool) { let color = self.myLabel.backgroundColor super.setHighlighted(highlighted, animated: animated) self.myLabel.backgroundColor = color } 

Vous pouvez également sous-classer l’étiquette que vous ne voulez pas changer de couleur:

 @interface PersistentBackgroundLabel : UILabel { } - (void)setPersistentBackgroundColor:(UIColor*)color; @end @implementation PersistentBackgroundLabel - (void)setPersistentBackgroundColor:(UIColor*)color { super.backgroundColor = color; } - (void)setBackgroundColor:(UIColor *)color { // do nothing - background color never changes } @end 

Ensuite, définissez la couleur une fois explicitement en utilisant setPersistentBackgroundColor :. Cela empêchera les changements de couleur d’arrière-plan de n’importe où sans utiliser votre méthode de changement de couleur d’arrière-plan explicite personnalisée.

Cela a également l’avantage d’éliminer les arrière-plans clairs sur l’étiquette lors des transitions.

Je peux me tromper, mais je ne pouvais pas trouver directement à remplacer un getter / setter existant dans Swift. À partir de la réponse de user479821, j’ai trouvé une solution de contournement qui semble produire les résultats souhaités. J’ai ajouté les annotations IBDesignable / IBInspectable si vous utilisez un storyboard, qui restitue la couleur finale dans l’éditeur.

 @IBDesignable class PersistentBackgroundLabel: UILabel { @IBInspectable var persistentBackgroundColor: UIColor = UIColor.clearColor() { didSet { super.backgroundColor = persistentBackgroundColor } } override var backgroundColor: UIColor? { didSet { if backgroundColor != persistentBackgroundColor { backgroundColor = persistentBackgroundColor } } } } 

J’ai le même problème et je suppose que c’est en quelque sorte un bug du framework UIKit. Merci mon dieu, j’ai une solution de contournement: l’ordre compte !!! Suivez simplement la séquence:

 - (void)tableView:(UITableView *)t willDisplayCell:(UITableViewCell*)c forRowAtIndexPath:(NSIndexPath *)i { UIColor *bgc = [UIColor redColor]; // Set up the cell in following order: c.textLabel.backgroundColor = bgc; c.backgroundColor = bgc; c.textLabel.text = @"foo"; } 

Je ne sais pas pourquoi, mais cette séquence fonctionne très bien et tout autre ordre fait apparaître que c.textLabel.backgroundColor a été forcé à effacer ColorColor dans certaines cellules après les avoir désélectionnées.

Ce n’était pas un comportement aléatoire, c’était la première fois que les cellules étaient réutilisées, pas lorsqu’elles étaient créées, ni lorsqu’elles étaient réutilisées. Avec la solution de contournement, cela fonctionne toujours bien.

Définissez la couleur d’arrière-plan sur label.layer.backgroundColor pour résoudre ce problème.

Il semble que la cellule change backgroundColor de UILabel lors de la mise en évidence.

Je crée simplement un indicateur dans la sous-classe UILabel pour désactiver le changement de couleur d’arrière-plan après awakeFromNib ou init. Cela permet à la couleur initiale définie dans le storyboard de prendre effet. Et nous n’avons pas besoin d’appeler des méthodes supplémentaires.

 @implementation MWPersistentBGLabel { BOOL disableBackgroundColorChange; } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; [self setup]; } - (void)setup { // disable background color change after setup is called disableBackgroundColorChange = YES; } // if we ever have to change the color later on, we can do so with this method - (void)setPersistentBackgroundColor:(UIColor*)color { [super setBackgroundColor:color]; } - (void)setBackgroundColor:(UIColor *)color { if (!disableBackgroundColorChange) { [super setBackgroundColor:color]; } // do nothing - background color never changes } @end 

Dans mes applications, je devais changer la couleur bleue du style de sélection de la cellule de vision, donc je devais définir l’affichage de l’image, lorsque je cliquais sur la cellule, elle était mise en surbrillance comme ImageView. Et j’ai enlevé la mise en évidence de la cellule quand je suis revenu à la vue. Et je ne pouvais pas comprendre votre problème clairement. Donc, juste donné mon code et essayez celui-ci,

  cellForRowAtIndexPath Method: CGRect a=CGRectMake(0, 0, 300, 100); UIImageView *bImg=[[UIImageView alloc] initWithFrame:a]; bImg.image=[UIImage imageNamed:@"bg2.png"]; [bImg setContentMode:UIViewContentModeScaleToFill]; cell.selectedBackgroundView=bImg; [bImg release]; -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; NSIndexPath *deselect = [self.tableView indexPathForSelectedRow]; [self.tableView deselectRowAtIndexPath:deselect animated:NO]; } 

Bonne chance

J’ai dû sous-classer UItableView, créer une liste de balises de la vue que je ne veux pas rendre en arrière-plan transparent et remplacer la méthode setHighlighted: animated: de sorte qu’elle réinitialise la couleur d’arrière-plan spécifique des étiquettes. longwinding et fidèlement, si seulement j’avais le code source de la classe réelle de UItableViewCell.

Je n’ai pas pu obtenir la réponse acceptée au travail; pas que je pense que la réponse est incorrecte (loin de là – cela semble être la bonne manière), mais comme j’écrivais ma première application iOS, ma tête tournait déjà avec des sous-classes. J’ai donc décidé de sortingcher.

Disons que la cellule personnalisée était contrôlée par une classe TableViewCell . J’ai créé un seul fichier .png pixels de la couleur d’arrière-plan correcte et créé un object UIImageView dans ma cellule personnalisée. J’ai utilisé l’inspecteur d’atsortingbuts pour définir l’image par défaut et utiliser «Scale To Fill». Pour un aspect un peu plus visuel, j’ai ensuite ajouté les éléments suivants aux atsortingbuts d’exécution définis par l’utilisateur dans l’inspecteur d’identité:

 KeyPath Type Value layer.cornerRadius Number 4 layer.masksToBounds Boolean YES 

Voilá, coins arrondis au rabais.

Positionné directement derrière l’UILabel, il ressemble à l’entreprise, bien qu’il ne soit évidemment pas redimensionné avec le contenu (le seul contenu étant sa propre image). Ce n’est pas un problème pour moi, car les données à afficher devaient de toute façon être de taille fixe.

Sur certaines valeurs, il était bon d’avoir une couleur différente, qui peut être réglée très facilement:

 cell.deviceDetailBackground.image = [UIImage imageNamed:@"detailBackground2.png"]; 

Où ‘cellule’ est l’incarnation de ma cellule personnalisée dans la méthode cellForRowAtIndexPath , créée à l’aide de la TableViewCell *cell; . Aucune donnée à afficher?

 cell.deviceDetailBackground.image = nil; 

Je suis sûr qu’il y aura une bonne raison pour que ce soit une idée idiote, mais comme je ne fais que commencer avec le développement iOS, c’était une solution facile qui fonctionnait pour moi. N’hésitez pas à me dire pourquoi ne pas le faire!