web-dev-qa-db-fra.com

UITableViewCell affiche un arrière-plan blanc et ne peut pas être modifié sur iOS7

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

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


Même pour Xcode7, 2015, there est un bogue dans le storyboard: vous devez définir la couleur d'arrière-plan d'une cellule dans le code.

186
Kjuly

Comme Apple DOC a déclaré ( Référence de la classe UITableViewCell ):

... 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 tabulaire englobante. Si vous souhaitez modifier la couleur d'arrière-plan d'une cellule, procédez de la manière suivante dans tableView: willDisplayCell: forRowAtIndexPath: méthode de votre délégué de vue de table.

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

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

Il suffit de noter : 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 ait le bogue, mais il semble tellement parce que son commentaire a obtenu plusieurs votes positifs. Donc, il y a peut-être un problème si vous utilisez IB. :)

383
Kjuly

Je l'ai étudié un peu et j'ai découvert que la cellule backgroundColor est définie par le système Appearance. Ainsi, si toutes les cellules de votre application ont un fond 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.

66
Anton Filimonov

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

cell.backgroundColor = [UIColor clearColor];
30
sanjana

J'ai en fait constaté que le problème venait de la couleur d'arrière-plan de UITableView qui n'était pas définie pour disparaître. Si vous modifiez la couleur d'arrière-plan de UITableViewCell en clair et 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()
13
Endama

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

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

cell.backgroundColor = [UIColor clearColor];
13
Yiming Tang

C'est définitivement un bogue iOS. Dans iOS 8, le réglage de la couleur d'arrière-plan dans Interface Builder fonctionne bien pour l'iPhone, mais dans iPad, il s'agit toujours de whiteColor. Pour résoudre ce problème, dans le message de source de données cellForIndexPath, insérez-le dans:

cell.backgroundColor = cell.backgroundColor

Et ça va marcher. C’est exactement la raison pour laquelle j’ai dit que c’était un bogue, car le code lui-même est plutôt bullsh * t, mais cela fonctionne.

10
superarts.org

Il se peut que votre UITableViewCell soit sélectionnée par défaut .. Vous pouvez le confirmer en utilisant le nouveau débogueur visuel de Xcode 6 (ou recherchez la vue exacte qui provoque l’apparition de cette cellule blanche).

enter image description here

Fait intéressant, après avoir appris cela…, régler la couleur d'arrière-plan de la cellule sélectionnée pour qu'elle disparaisse n'a toujours pas fonctionné . je viens de modifier le style de sélection lors de la création de cette cellule personnalisée:

- (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;
}
4
abbood

J'ai trouvé qu'aucun de ce qui précède 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 Afficher, modifiez le fond par défaut de l'arrière-plan en Clear Color:

enter image description here

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

3
Mike

Pour moi, régler cell.backgroundColor = cell.contentView.backgroundColor; dans tableView:willDisplayCell:forRowAtIndexPath: ou tableView:cell:forRowAtIndexPath: a effectué le travail.

Cela est dû au fait que je définis la couleur d'arrière-plan de contentView dans Interface Builder.

2
mllm

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 tabulaire. Ensuite, dans l'inspecteur d'attributs, dans la section View, définissez le Background sur transparent (0% d'opacité).

enter image description here

  1. A 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
    
2
RajV

Avait un problème similaire, dû

  1. Définissez 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
    }
    
1
Nakul Sudhakar

Solution Swift 1.2:

Ajoutez simplement une définition explicite de la couleur d’arrière-plan de votre cellule, comme suit:

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

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

    return cell
}
1
Dan Beaulieu

Lors de l'ajout d'objets d'interface utilisateur à une cellule, Xcode 5/IOS 7 ajoute une nouvelle "Vue du contenu" qui sera la vue d'ensemble 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 celui-ci a bien fonctionné pour moi.

1
DrBug

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

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

C'est le code pour appliquer la méthode du code de 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];
}
0