使用CALayer设置UITableViewCell背景颜色

在iOS上,我将一个CALayer添加到UITableViewCell的图层中。 这是我第一次使用CALayer,它只是改变表格单元格的背景颜色。 我的目标是(1)学习如何使用CALayer,(2)使用Instruments来testing绘图是否比当前的实现更快,这会降低CGContextFillRect的速度。

( 技术问答QA1708是所有这一切的催化剂。)

目前的实施(工程)

- (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:(NSString *)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 // [...] } 

我看到了正确的颜色,但没有其他的绘图(我假设自定义绘图结束了我的新层)。

如果我删除backgroundLayer.frame = ...行,我所有的其他绘图仍然存在,但在黑色的背景。

我错过了什么?

你得到意想不到的行为的原因是因为UITableViewCell的相对复杂的视图层次结构:

 - UITableViewCell - contentView - backgroundView - selectedBackgroundView 

无论何时在UITableViewCell定义自定义绘图例程,都应在contentView层次结构中进行。 这包括-drawRect: UIView ,覆盖-drawRect:并将其作为子视图添加到contentView

你的背景颜色在你的例子中被忽略的原因是你将CALayer添加为UITableViewCell图层的子层。 这被UITableViewCellcontentView遮住了。

但是,由于某种原因,您希望在这里使用CALayer 。 我想了解为什么它没有UIView没有的东西。 你可以在你的contentView上设置backgroundColor ,而不是做这个迂回的事情。

下面是一个使用CALayer的例子:

 @implementation JRTableViewCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)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