代码之家  ›  专栏  ›  技术社区  ›  Aaron Brager

使用CALayer设置UITableViewCell背景色

  •  1
  • Aaron Brager  · 技术社区  · 11 年前

    在iOS上,我正在向UITableViewCell的层添加一个CALayer。这是我第一次使用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 回复  |  直到 11 年前
        1
  •  3
  •   Jacob Relkin    4 年前

    你出现意外行为的原因是 UITableViewCell 的相对复杂的视图层次结构:

    - UITableViewCell
       - contentView
       - backgroundView
       - selectedBackgroundView
    

    无论何时在 UITableView单元格 ,您应该在 contentView 等级制度这涉及到子类化 UIView 最重要的 -drawRect: ,并将其作为子视图添加到 内容视图 .

    在您的示例中,您的背景颜色被忽略的原因是您添加了 CALayer 作为 UITableView单元格 的图层。这被 UITableView单元格 内容视图 .

    但是,由于某些原因,您希望使用 CAL层 在这里我想知道为什么,因为它没有任何 UI视图 没有。您可以设置 backgroundColor 在您的 内容视图 而不是做这些迂回的事情。

    下面是一个使用 CAL层 按照您的要求:

    @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] cgColor]]; //use whatever color you wish.
    
       [self.contentView.layer addSublayer:layer];
    }
    
    @end