35 votes

Définir la couleur d'arrière-plan d'une cellule d'un tableau sur l'iPhone

Je veux obtenir l'effet suivant : une cellule de la vue tableau aura un fond bleu, la suivante sera blanche, la suivante sera à nouveau bleue, puis blanche et ainsi de suite... Pourriez-vous me dire comment faire ?

Merci.

0 votes

1 votes

@willcodejavaforfood ce commentaire est très peu utile et n'est pas pertinent pour la question de l'OP.

73voto

jessecurry Points 12114

Ajoutez cette méthode au délégué de votre vue de table :

#pragma mark UITableViewDelegate
- (void)tableView: (UITableView*)tableView 
  willDisplayCell: (UITableViewCell*)cell 
forRowAtIndexPath: (NSIndexPath*)indexPath
{
    cell.backgroundColor = indexPath.row % 2 
        ? [UIColor colorWithRed: 0.0 green: 0.0 blue: 1.0 alpha: 1.0] 
        : [UIColor whiteColor];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];
}

3 votes

+1 Cela a fonctionné et c'est la seule façon de faire tenir le paramètre textLabel.backgroundColor. Le réglage dans tableView:cellForRowAtIndexPath : n'a pas fonctionné pour moi (OS 3.2) mais cette méthode a fonctionné.

2 votes

Il existe une ancienne vidéo de la WWDC datant de 2009 ou 2010 qui traite de ce sujet. La vue tableau ajuste l'arrière-plan pour gérer les états de sélection des cellules, c'est pourquoi le seul endroit où vous pouvez le modifier de manière fiable est la méthode willDisplayCell.

0 votes

Est-ce que quelqu'un comprend pourquoi le réglage dans cellforrowatindex ne fonctionne pas correctement ? J'ai essayé avec cette méthode, mais %2 ne le fait pas correctement pour une ligne sur deux. Et lorsque vous faites défiler vers le haut et vers le bas plusieurs fois, l'arrière-plan de chaque cellule change. willDisplayCell fonctionne cependant, mais je me demande juste pourquoi cela ne fonctionne pas pour cellforrow.

43voto

newgenapps_dev Points 23557

Vous devez définir la couleur de fond de la vue du contenu de la cellule.

cell.contentView.backgroundColor = [UIColor colorWithRed...]

Ceci définira l'arrière-plan de la cellule entière.

Pour ce faire, pour les cellules alternées, utilisez la fonction indexPath.row y % par 2.

9voto

gamozzii Points 3015

Si vous souhaitez définir la couleur de la cellule en fonction d'un état de l'objet de données de la cellule, il s'agit d'une autre approche :

Si vous ajoutez cette méthode à votre délégué de vue de table :

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = cell.contentView.backgroundColor;
}

Ensuite, dans votre méthode cellForRowAtIndexPath vous pouvez faire :

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Cela évite de devoir récupérer à nouveau vos objets de données dans la méthode willDisplayCell.

1 votes

J'ai constaté que cette approche permet également d'éviter de devoir modifier l'arrière-plan des étiquettes de texte - le tableView semble les ajuster automatiquement pour qu'elles correspondent à la couleur d'arrière-plan de la cellule. Pour mon cas d'utilisation, c'est la solution la plus simple parmi les réponses présentées ici.

6voto

safil sunny Points 86

Veuillez ajouter le code suivant dans le cellForRowAtIndexPath

if (indexPath.row % 2 == 0){
    cell.backgroundColor =[UIColor blueColor];
} else {
    cell.backgroundColor =[UIColor whiteColor];
}

Je pense que cela va vous aider

4voto

henning77 Points 2263

El cell.contentView.backgroundColor = [UIColor colorWithRed...] de la réponse de lostInTransit fonctionne, tant que vous n'utilisez pas l'étiquette intégrée d'une UITableViewCell.

J'ai découvert que si vous utilisez l'étiquette intégrée, par exemple en définissant cell.text vous vous retrouvez avec un bloc blanc opaque sous l'étiquette et seules les deux extrémités de la cellule affichent la couleur souhaitée.

Je n'ai trouvé aucun moyen de modifier l'étiquette intégrée afin qu'elle soit non opaque (vous pouvez y accéder via UILabel* cellLabel = [cell.contentView.subviews objectAtIndex:0] ).

J'ai résolu le problème en ajoutant ma propre personnalisation UILabel . Comme ça :

UILabel* cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
cellLabel.text = @"Test with non-opaque label";
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.opaque = NO;

[cell.contentView addSubview:cellLabel];
cell.contentView.backgroundColor = [UIColor darkGrayColor];

0 votes

Vous ne devriez pas créer une étiquette et changer sa couleur de fond quand vous pouvez simplement changer la couleur de fond de la cellule. cell.backgroundColor = [UIColor ...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X