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