ios - 使用 CALayer 设置 UITableViewCell 背景颜色

标签 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 = ...线,我所有的其他绘图仍然存在,但在黑色背景上。

我错过了什么?

最佳答案

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

- UITableViewCell
   - contentView
   - backgroundView
   - selectedBackgroundView

每当您在 UITableViewCell 中定义自定义绘图例程时, ,您应该在 contentView 内这样做等级制度。这涉及子类 UIView , 覆盖 -drawRect: , 并将其作为 subview 添加到 contentView .

在您的示例中您的背景颜色被忽略的原因是由于您添加了 CALayer作为 UITableViewCell 的子层的层。这被 UITableViewCell 所掩盖。的contentView .

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

这是一个使用 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] cgColor]]; //use whatever color you wish.

   [self.contentView.layer addSublayer:layer];
}

@end

关于ios - 使用 CALayer 设置 UITableViewCell 背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212251/

相关文章:

iOS 确认 UIAlertView 在 "Are you sure?"设置 App

objective-c - Xcode 4.2 音板

iphone - 以编程方式打开设置 iOS 6

cocoa - 如何使用 CALayer 绘制边框或文本?

iphone - 有没有办法改变模态视图 Controller 外观的动画样式?

iphone - 如何将两个 CABasicAnimation 动画分组并同时启动它们?

ios - 批量请求单个objectID swift

ios - 使用 iOS 委托(delegate)

ios - 需要一些关于调度队列、线程和 NSRunLoop 的说明

objective-c - 菜单栏应用程序永远不会重新激活