使用CALayer设置UITableViewCell背景颜色

时间:2013-03-04 22:21:00

标签: ios objective-c core-animation calayer quartz-graphics

在iOS上,我将CALayer添加到UITableViewCell的图层。这是我第一次使用CALayer,它应该只是改变表格单元格的背景颜色。我的目标是(1)学习如何使用CALayer,以及(2)使用Instruments测试绘图是否比我当前的实现更快,这会减慢CGContextFillRect。

Technical Q&A 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 = ...行,我的所有其他绘图仍然存在,但是在黑色背景上。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您遇到意外行为的原因是UITableViewCell相对复杂的视图层次结构:

- UITableViewCell
   - contentView
   - backgroundView
   - selectedBackgroundView

每当您在UITableViewCell中定义自定义绘图例程时,您应该在contentView层次结构中这样做。这涉及对UIView进行子类化,覆盖-drawRect:,并将其作为子视图添加到contentView中。

您的示例中忽略背景颜色的原因是您将CALayer添加为UITableViewCell图层的子图层。这被UITableViewCell的{​​{1}}隐藏了。

但是,出于某种原因,您希望在此处使用contentView。我想理解为什么它没有CALayer没有的东西。您可以在UIView上设置backgroundColor,而不是执行此环形组合。

以下是您根据要求使用contentView的示例:

CALayer