Question Comment personnaliser la couleur d'arrière-plan d'un UITableViewCell?


Je voudrais personnaliser l'arrière-plan (et peut-être aussi la bordure) de tous les UITableViewCells de mon UITableView. Jusqu'à présent, je n'ai pas été en mesure de personnaliser ces éléments, j'ai donc un tas de cellules de fond blanc par défaut.

Existe-t-il un moyen de le faire avec le SDK iPhone?


183
2017-11-11 17:11


origine


Réponses:


Vous devez définir le backgroundColor du contenu de la cellule à votre couleur. Si vous utilisez des accessoires (tels que des flèches d’information, etc.), ils apparaîtront comme des blancs, vous devrez donc peut-être en imprimer des versions personnalisées.


186
2017-11-11 18:13



Voici la méthode la plus efficace pour résoudre ce problème, utilisez la méthode déléguée willDisplayCell (elle prend également en compte la couleur blanche de l’arrière-plan de l’étiquette lorsque vous utilisez cell.textLabel.text et / ou cell.detailTextLabel.text). ):

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

Lorsque cette méthode de délégué est appelée, la couleur de la cellule est contrôlée via la cellule plutôt que la vue de table, comme lorsque vous utilisez:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

Donc, dans le corps de la méthode de délégation de cellule, ajoutez le code suivant pour alterner les couleurs des cellules ou utilisez simplement l'appel de fonction pour que toutes les cellules du tableau aient la même couleur.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Cette solution a bien fonctionné dans ma situation ...


204
2017-08-03 07:02



C'est très simple, puisque OS 3.0 ne définit que la couleur d'arrière-plan de la cellule dans la méthode willDisplayCell. Vous ne devez pas définir la couleur dans le cellForRowAtIndexPath.

Cela fonctionne à la fois pour le style simple et groupé:

Code:

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

P.S: Voici l'extrait de documentation pour willDisplayCell:

"Une vue de table envoie ce message à   son délégué juste avant qu'il utilise la cellule   tracer une ligne, permettant ainsi   déléguer pour personnaliser l'objet cellulaire   avant qu'il ne soit affiché. Cette méthode   donne au délégué une chance de   remplacer le jeu de propriétés basé sur l'état   plus tôt par la vue table, par exemple   sélection et couleur de fond. Après   le délégué retourne, la vue table   ne définit que l'alpha et le cadre   propriétés, et seulement quand   animer les lignes comme ils glissent ou   en dehors."

J'ai trouvé cette information dans ce post de colionel. Merci lui!


104
2018-05-10 13:57



La meilleure approche que j'ai trouvée jusqu'à présent est de définir une vue d'arrière-plan de la cellule et un arrière-plan clair des sous-vues de cellules. Bien sûr, cela semble bien sur les tables avec style indexé uniquement, avec ou sans accessoires.

Voici un exemple où le fond de la cellule est haleté en jaune:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

57
2017-11-14 14:31



Mettez simplement ceci dans votre fichier de classe de délégué UITableView (.m):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

19
2018-04-17 10:03



Je suis d'accord avec Seba,    J'ai essayé de définir ma couleur de ligne en alternance dans la méthode déléguée rowForIndexPath, mais mes résultats étaient incohérents entre 3.2 et 4.2. Ce qui suit a bien fonctionné pour moi.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

7
2017-12-06 15:01



Après avoir essayé toutes les différentes solutions, la méthode suivante est la plus élégante. Changez la couleur dans la méthode de délégué suivante:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

6
2018-06-08 09:43



vlado.grigorov a de bons conseils - le meilleur moyen est de créer un backgroundView et de lui donner une couleur, en définissant tout le reste sur clearColor. De plus, je pense que c'est la seule façon d'effacer correctement la couleur (essayez son exemple - mais définissez 'clearColor' au lieu de 'yellowColor'), ce que j'essayais de faire.


4
2018-03-04 06:10



Personnaliser l'arrière-plan d'une cellule de vue de tableau devient éventuellement une approche "tout ou rien". Il est très difficile de changer la couleur ou l'image utilisée pour l'arrière-plan d'une cellule de contenu d'une manière qui ne semble pas étrange.

La raison en est que la cellule couvre réellement la largeur de la vue. Les coins arrondis ne sont qu'une partie de son style de dessin et la vue du contenu se trouve dans cette zone.

Si vous modifiez la couleur de la cellule de contenu, vous obtiendrez des bits blancs visibles dans les coins. Si vous changez la couleur de la cellule entière, vous aurez un bloc de couleur couvrant la largeur de la vue.

Vous pouvez certainement personnaliser une cellule, mais ce n'est pas aussi simple que vous le pensez au premier abord.


3
2017-11-11 21:32



Créez une vue et définissez-la comme vue d'arrière-plan de la cellule

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

3
2017-09-28 10:32



Pour étendre la réponse de N.Berendt - Si vous souhaitez définir la couleur de la cellule en fonction d'un état dans l'objet de données de cellule réel, au moment où vous configurez le reste de l'information pour la cellule de tableau, ce qui est généralement le cas La méthode cellForRowAtIndexPath, vous pouvez le faire en redéfinissant la méthode willDisplayCell pour définir la couleur d'arrière-plan de la cellule à partir de la couleur d'arrière-plan de la vue de contenu - contournant le problème de l'arrière-plan du bouton de divulgation. où vous faites toutes vos autres personnalisations de cellules.

Alors: 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 d'avoir à récupérer vos objets de données à nouveau dans la méthode willDisplayCell et enregistre également deux endroits où vous personnalisez / personnalisez votre cellule de tableau - toute personnalisation peut aller dans la méthode cellForRowAtIndexPath.


3
2018-02-02 01:08