Définir la couleur d'arrière-plan UITableViewCell à l'aide d'un CALayer

Sur iOS, j'ajoute un CALayer à la couche d'UITableViewCell. C'est la première fois que j'utilise CALayer, et il est simplement supposé changer la couleur d'arrière-plan de la cellule du tableau. Mon objective est (1) d'apprendre à utiliser CALayer, et (2) de tester à l'aide d'Instruments si le dessin est plus rapide que mon implémentation actuelle, qui ralentit sur CGContextFillRect.

( QA1708 technique Q & A a été le catalyseur pour tout cela.)

Mise en œuvre actuelle (travaux)

- (void)drawRect:(CGRect)r { UIColor *myColor = [self someColor]; [myColor set]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextFillRect(context, r); // draw the background color // now draw everything else // [...] } 

Tentative de nouvelle implémentation (ne fonctionne pas)

 #import <QuartzCore/QuartzCore.h> @implementation MyCell { CALayer *backgroundLayer; } - (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSSsortingng *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // [...other stuff here too] backgroundLayer = [[CALayer alloc] init]; [[self layer] addSublayer:backgroundLayer]; } return self; } - (void)drawRect:(CGRect)r { backgroundLayer.frame = CGRectMake(0, 0, r.size.width, r.size.height); [backgroundLayer setBackgroundColor:[self someColor]]; // now draw everything else // [...] } 

Je vois les colors correctes, mais aucun des autres dessins (je suppose que le dessin personnalisé se retrouve derrière mon nouveau calque).

Si j'enlève la ligne backgroundLayer.frame = ... , tous mes autres dessins sont toujours là, mais sur un fond noir.

Qu'est-ce que je rate?

La raison pour laquelle vous obtenez un comportement inattendu est due à la UITableViewCell des UITableViewCell relativement complexe de UITableViewCell :

 - UITableViewCell - contentView - backgroundView - selectedBackgroundView 

Chaque fois que vous définissez des routines de dessin personnalisées dans UITableViewCell , vous devez le faire dans la hiérarchie contentView . Cela implique de sous- UIView , de surcharger -drawRect: et de l'append en tant que sous-vue dans contentView .

La raison pour laquelle votre couleur d'arrière-plan a été ignorée dans votre exemple était due à l'ajout de votre CALayer tant que sous-couche de la couche UITableViewCell . Ceci est masqué par UITableViewCell de contentView .

Cependant, pour une raison quelconque, vous souhaitez utiliser un CALayer ici. Je voudrais comprendre pourquoi car il n'a rien que UIView n'a pas. Vous pouvez définir backgroundColor sur votre contentView au lieu de faire ce jeu de choses.

Voici un exemple utilisant CALayer comme vous l'avez demandé:

 @implementation JRTableViewCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSSsortingng *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self) { [self addCustomLayerToContentView]; } return self; } - (void)addCustomLayerToContentView { CALayer *layer = [[CALayer alloc] initWithFrame:[self bounds]]; [layer setBackgroundColor:[UIColor blueColor]]; //use whatever color you wish. [self.contentView.layer addSublayer:layer]; } @end