UITableViewCell affiche un fond blanc et ne peut pas être modifié sur iOS7


186

J'ai implémenté une classe de cellules de vue tableau personnalisée qui hérite de UITableViewCell. La vue du tableau contient une image d'arrière-plan, je veux donc que l'arrière-plan de la cellule soit transparent. Cela a l'air bien avant iOS7.

Cependant, dans iOS7, la cellule est toujours affichée avec un fond blanc.


Même pour Xcode7, 2015, il y a un bug dans le storyboard : il faut définir la couleur de fond d'une cellule dans le code.


vous pouvez changer la couleur d'arrière-plan de la cellule directement en accédant à sa couleur d'arrière-plan de propriété. cell.backgroundColor = [UIColor clearColor];
ViruMax

Réponses:


384

Comme l'a dit Apple DOC ( UITableViewCell Class Reference ):

... Dans iOS 7, les cellules ont un fond blanc par défaut ; dans les versions antérieures d'iOS, les cellules héritent de la couleur d'arrière-plan de la vue de tableau englobante. Si vous souhaitez modifier la couleur d'arrière-plan d'une cellule, faites-le dans tableView: willDisplayCell: forRowAtIndexPath: méthode de votre délégué de vue de table.

Donc, pour mon cas, pour afficher les cellules avec un arrière-plan transparent, il suffit d'implémenter la méthode de délégation dans le contrôleur de vue de table comme ci-dessous:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

Remarque : comme @null l'a dit, "... il semble y avoir un bogue dans le constructeur d'interface ..." , je ne suis pas tout à fait sûr qu'il y ait un bogue, mais il semble que son commentaire ait obtenu plusieurs votes. Il peut donc y avoir quelque chose qui ne va pas si vous utilisez IB. :)


53
Malheureusement, ce n'est pas vrai, il semble y avoir un bogue dans le générateur d'interface et je n'ai pas pu le définir dans ma cellule personnalisée à partir du storyboard.
Tarek Hallak

1
@null, aha, semble que le SDK iOS 7 a encore beaucoup de bogues à corriger. J'en ai déjà rencontré, mais pour Storyboard, je n'en ai aucune idée. :)
Kjuly

4
Vous pouvez également le faire dans la tableView:cellForRowAtIndexPath:méthode.
bugloaf

1
@KendallHelmstetterGelner sûr? Je ne l'ai pas encore remarqué, semble toujours fonctionner pour moi. :)
Kjuly

1
Comme dit ci - dessus bugloaf - le faire en tableView: cellForRowAtIndexPath:
Amergin

66

Je l'ai étudié un peu et j'ai découvert que la cellule backgroundColor est définie par le système Appearance. Donc, si toutes les cellules de votre application ont un arrière-plan clair, la solution la plus simple serait:

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

Et même s'ils ont un arrière-plan différent, la couleur claire semble être la plus pratique par défaut.


1
Tu es mon ami un monstre. Je sous-classe tous mes UITableViewCells, donc ce n'était pas un problème pour moi de fournir une superclasse avec un initialiseur pour définir la couleur BG clearColor, mais devinez quoi? Cela n'a pas fonctionné ... Je veux dire, POURQUOI, APPLE?
Mazyod

Cela marche. Cependant, la couleur blanche apparaît hors de vue. Je suis allé avec une réponse supérieure pour le meilleur effet (pas de popping).
Carl Prehn

@Anton Filimonov J'ai défini l'apparence de la cellule de vue tableau dans mon Appdelegate maintenant dans un viewController particulier Je veux avoir une couleur différente pour la cellule, comment puis-je aborder ce scénario? J'ai essayé de définir une couleur différente dans la méthode de délégation CellWillDisplay mais sans effet. Pourriez-vous s'il vous plaît m'aider à ce sujet
Peer Mohamed Thabib

@PeerMohamedThabib veuillez en dire plus sur l'environnement (iPad / iPhone, version iOS) et fournir du code. Et en fait, vous pouvez étudier la situation vous-même - créez simplement une sous-classe de UITableViewCell, redéfinissez la méthode setBackgroundColor: (appelez simplement l'implémentation de la superclasse à l'intérieur) et mettez un point d'arrêt à cette méthode et vous verrez, ce qui change la couleur de la cellule après l'avoir définie à l'intérieur de la tableView: willDisplayCellAtIndexPath:
Anton Filimonov

1
Même si vous avez des cellules mixtes, certaines avec un arrière-plan et d'autres sans (transparent). Le moyen le plus simple est de définir une classe personnalisée et d'écrire le même code. De cette façon, toutes les classes UITableViewCell resteront par défaut et les classes personnalisées auront une couleur claire. [[Apparence CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Cela n'affectera pas les cellules UITableViewCells par défaut et n'affectera que les cellules personnalisées.
Ansari

30

Écrivez ceci dans votre méthode cellForRowAtIndexPath avant de retourner la cellule;

cell.backgroundColor = [UIColor clearColor];

1
Cela m'a aidé avec un problème dans iOS 8 sur iPhone 5.
Almo

13

La couleur d'arrière-plan par défaut d'un UITableViewCelldans iOS 7 est le blanc.

Vous devez définir la backgroundColorpropriété quelque part dans votre code. Par exemple, définissez-le après avoir nouvellement créé la cellule.

cell.backgroundColor = [UIColor clearColor];

J'ai essayé mais cela n'a pas fonctionné pour moi. Êtes-vous sûr que cela fonctionne?
Matrosov Alexander

Fonctionne pour moi pour une cellule de vue de tableau personnalisée dans la méthode initWithCoder: aDecoder.
ftvs

13

En fait, j'ai trouvé que le problème venait du fait que la couleur d'arrière-plan de l'UITableView n'était pas définie sur effacer. Si vous modifiez la couleur d'arrière-plan de UITableViewCell pour effacer et que vous constatez que vous voyez toujours du blanc, assurez-vous que la couleur d'arrière-plan de UITableView est définie sur effacer (ou ce que vous voulez).

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

Dans Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

Juste pour info, vous pouvez également définir cela dans IB. Assurez-vous simplement de changer la couleur d'arrière-plan dans la section «Affichage», et pas seulement dans la section «Vue du tableau» qui n'a apparemment aucun effet notable.
AndyDunn

1
cela a fonctionné pour moi aussi, je cherchais la version rapide de celui-ci. Ajout de ce qui a fonctionné pour moi dans le code :)
Mugunthan Balakrishnan

10

C'est définitivement un bogue iOS. Dans iOS 8, la définition de la couleur d'arrière-plan Interface Builderfonctionne bien pour iPhone, mais sur iPad, c'est toujours whiteColor. Pour résoudre ce problème, dans le cellForIndexPathmessage de la source de données, insérez ceci:

cell.backgroundColor = cell.backgroundColor

Et cela fonctionnera. C'est exactement pourquoi j'ai dit que c'était un bogue puisque le code lui-même est plutôt bullsh * t, mais cela fonctionne.


Toujours le cas pour Xcode7 / iOS9. J'ai ajouté le code explicite dans tableView: willDisplayCell: forRowAtIndexPath comme suggéré ci-dessus.
Andrew Duncan

Dans XCode 7.0.1, l'application universelle de compilation montrait un fond noir sur l'iPhone exécutant iOS 7,8,9 mais un fond blanc sur l'iPad exécutant iOS 9.0.2 (et probablement d'autres, mais ne peut pas vérifier). Le code ci-dessus l'a corrigé.
ScottyB

Pour la table statique, remplacez willDisplayCell par cell.backgroundColor = UIColor.clearColor (). La réattribution de la configuration des couleurs dans IB n'a pas fonctionné pour moi.
Viktor Kucera

4

Il se peut que votre UITableViewCell soit sélectionné par défaut. Vous pouvez le confirmer en utilisant le nouveau débogueur visuel de Xcode 6 (ou découvrir exactement quelle vue provoque l'apparition de cette cellule blanche).

entrez la description de l'image ici

Fait intéressant, après avoir su cela .. définir la couleur d'arrière-plan de la cellule sélectionnée pour effacer ne fonctionnait toujours pas.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

lien cassé pour le débogueur visuel
Suragch

3

J'ai constaté qu'aucun de ces éléments ne fonctionnait à partir de XCode 5.1.1, iOS 7.1.

Si vous utilisez Interface Builder avec des cellules prototypes, sélectionnez la cellule prototype, puis dans le sélecteur d'attributs de la section Vue, modifiez la valeur par défaut du formulaire d'arrière-plan sur Effacer la couleur:

entrez la description de l'image ici

Cela semble bien fonctionner. Aucune des modifications de code ci-dessus n'est nécessaire non plus - il s'agit d'une solution IB pure.


2

La réponse acceptée n'a pas résolu le problème pour moi. Je devais faire ceci:

  1. Dans le générateur d'interface, sélectionnez la vue de table. Ensuite, à partir de l'inspecteur d'attributs, dans la section Vue , définissez l' arrière - plan sur transparent (opacité de 0%).

entrez la description de l'image ici

  1. À partir de la méthode cellForRowAtIndexPath de la classe de source de données de la table:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

Eh bien, vous utilisez Interface Builder .. comme @null l'a commenté ci-dessous ma réponse, "... il semble y avoir un bogue dans le constructeur d'interface ..." , je ne suis pas tout à fait sûr qu'il y ait un bogue, mais cela semble être la cause le commentaire a obtenu plusieurs votes. ;)
Kjuly

Quelque chose dans iOS7 est définitivement bogué en ce qui concerne l'arrière-plan transparent des cellules. J'espère que ma réponse aidera d'autres personnes confrontées à une situation similaire à moi.
RajV

Ce n'est pas la bonne façon de créer des cellules pour votre vue de table, surtout si vous utilisez Interface Builder / Storyboards. Dans l'extrait de code, vous créez une nouvelle cellule chaque fois que votre délégué est invité à en saisir une, ce n'est pas une réutilisation! Pour bénéficier des avantages de la réutilisation des cellules, vous devez utiliser cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Dans les versions antérieures, vous supprimez l'argument indexPath, puis testez la valeur nil, instanciant avec initWithStyle:reuseIdentifierselon votre extrait de code dans le cas nil.
ikuramedia

ikuramedia: J'ai laissé le code de réutilisation hors de mon message. Bien sûr, je réutilise les cellules. Ce n'est pas le but de cet article.
RajV

2

Pour moi , la mise cell.backgroundColor = cell.contentView.backgroundColor; soit dans tableView:willDisplayCell:forRowAtIndexPath:ou tableView:cell:forRowAtIndexPath:fait le travail.

C'est parce que j'ai défini la couleur d'arrière-plan de contentView dans Interface Builder comme souhaité.


1

Lors de l'ajout d'objets d'interface utilisateur à une cellule, Xcode 5 / IOS 7 ajoute une nouvelle «vue de contenu» qui sera la vue de tous les éléments de la cellule. Pour définir la couleur d'arrière-plan de la cellule, définissez la couleur d'arrière-plan de cette vue de contenu. Les solutions ci-dessus n'ont pas fonctionné pour moi, mais celle-ci a bien fonctionné pour moi.


L'affichage du contenu est disponible dans les versions précédentes du SDK, il vous suffit de définir une couleur d'arrière-plan pour l'affichage du contenu qui couvre la vue d'arrière-plan de la cellule.
Kjuly

Eh bien, il ne s'affiche pas automatiquement dans le constructeur d'interface avant xcode 5. Quel est exactement votre point?
DrBug

Je veux dire, votre réponse a discuté pour une autre question, pas ma question posée. Vous voulez juste définir une couleur d'arrière-plan pour votre cellule, non? Ainsi, peu importe que les cellules aient un fond blanc par défaut ou non dans iOS 7, vous pouvez toujours l'implémenter en définissant une couleur pour la vue du contenu, car la vue du contenu se trouve sur la vue en arrière-plan de la cellule. Ça a du sens? ;)
Kjuly

1

Solution Swift 1.2:

Ajoutez simplement une définition explicite pour la couleur d'arrière-plan de votre cellule comme ceci:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

Désolé. C'est de ma faute. Ça marche. J'ai manqué d'autres paramètres.
Sung Kim

1

Eu un problème similaire, a dû

  1. Définissez le bleu comme style de sélection et
  2. ajoutez ceci au code pour le corriger

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

Vous pouvez également utiliser un code couleur pour rendre votre cellule UITableView lucrative.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

Voici le code pour appliquer la méthode du code couleur:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.