在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 = ...
行,我的所有其他绘图仍然存在,但是在黑色背景上。
我错过了什么?
答案 0 :(得分:3)
您遇到意外行为的原因是UITableViewCell
相对复杂的视图层次结构:
- UITableViewCell
- contentView
- backgroundView
- selectedBackgroundView
每当您在UITableViewCell
中定义自定义绘图例程时,您应该在contentView
层次结构中这样做。这涉及对UIView
进行子类化,覆盖-drawRect:
,并将其作为子视图添加到contentView
中。
您的示例中忽略背景颜色的原因是您将CALayer
添加为UITableViewCell
图层的子图层。这被UITableViewCell
的{{1}}隐藏了。
但是,出于某种原因,您希望在此处使用contentView
。我想理解为什么它没有CALayer
没有的东西。您可以在UIView
上设置backgroundColor
,而不是执行此环形组合。
以下是您根据要求使用contentView
的示例:
CALayer