1

我有实现自定义绘制设计的自定义 UITableViewCell 类(如您所见,单元格具有阴影效果。)正如您在下面看到的,我正在尝试用白色绘制第一个单元格,任何其他单元格都必须是灰色的。

- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;
if (_rowNumber == 0)
    CGColorRef lightColor = [UIColor whiteColor].CGColor;
else
    CGColorRef lightColor = [UIColor grayColor].CGColor;
CGColorRef darkColor = _darkColor.CGColor;
CGColorRef shadowColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:0.5].CGColor;
CGContextSetFillColorWithColor(context, whiteColor);

CGContextFillRect(context, _paperRect);
CGContextSaveGState(context);

CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 7.0, shadowColor);
CGContextSetFillColorWithColor(context, lightColor);

CGContextFillRect(context, _coloredBoxRect);
CGContextRestoreGState(context); 
}

问题是:当我使用 dequeueReusableCellWithIdentifier 时,“drawRect”方法只调用了 3 次(我的单元格的高度为 200),所以第四个单元格的颜色与第一个相同。

有什么办法可以解决这个问题吗?谢谢

更新我试图从 UITableViewController 调用我的自定义重绘方法,但我有“空”上下文错误

- (void)refreshColorOfRow:(int)row{
 CGContextRef context = UIGraphicsGetCurrentContext();
 if (row > 0)
     _lightColor = [UIColor colorWithRed:200.0f/255.0f green:199.0f/255.0f blue:200.0f/255.0f alpha:1.0];
 else
     _lightColor = [UIColor colorWithRed:240.0f/255.0f green:240.0f/255.0f blue:240.0f/255.0f alpha:1.0];
CGColorRef lightColor = _lightColor.CGColor;
CGContextSetFillColorWithColor(context, lightColor);
CGContextFillRect(context, _coloredBoxRect);
CGContextRestoreGState(context);
}
4

3 回答 3

1

我假设您正在设置_rowNumber为您的UITableViewCell子类的属性。您应该在 setter 中调用 setNeedsDisplay 来强制重绘:

-(void) setRowNumber:(int)value {
    _rowNumber = value;
    [self setNeedsDisplay];
}
于 2013-01-30T12:43:08.780 回答
1

我认为你可以使first cellother cells不同identifier,比如first cells resueIdentifier 是@"first"other cellss resueIdentifier 是@"others"然后在您的自定义单元格中,您可以创建一个BOOL _isFirstCell标记first cell然后在 - (void)drawRect:(CGRect)rect方法中,您可以绘制两种类型的单元格使用if else语句

- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor;
if (_isFirstCell)
    CGColorRef lightColor = [UIColor whiteColor].CGColor;
else
    CGColorRef lightColor = [UIColor grayColor].CGColor;
CGColorRef darkColor = _darkColor.CGColor;
CGColorRef shadowColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:0.5].CGColor;
CGContextSetFillColorWithColor(context, whiteColor);

CGContextFillRect(context, _paperRect);
CGContextSaveGState(context);

CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 7.0, shadowColor);
CGContextSetFillColorWithColor(context, lightColor);

CGContextFillRect(context, _coloredBoxRect);
CGContextRestoreGState(context); 
}
于 2013-01-30T12:45:12.163 回答
1

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath你可以打电话[cell setNeedsDisplay];

[cell setBackgroundColor:[UIColor yourColorXY]];但是,如果您只想要一些简单的颜色和阴影,为什么不使用呢?

编辑: 就像郭陆川说的,是一个经常被称为drawRect:表演杀手的人。试试简单吧;)

NSIndexPath *selectedCell; //Declare this in your .h

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier: CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
    }
    if (selectedCell.section==indexPath.section && selectedCell.row==indexPath.row) {
        [cell.contentView setBackgroundColor:[UIColor whiteColor]];
        [cell.textLabel setText:@"The Choosen One"];
    } else {
        [cell.contentView setBackgroundColor:[UIColor lightGrayColor]];
        [cell.textLabel setText:@"FOO"];
    }
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    selectedCell=indexPath;
    [tableView reloadData];
}

对于阴影,你可以玩弄..

#import <QuartzCore/QuartzCore.h>

CALayer *layer=[cell layer]; //Or [tableView layer] or whatever you need
[layer setShadowColor:[[UIColor lightGrayColor] CGColor]];
[layer setShadowOffset:CGSizeMake(1, 1)];
[layer setShadowOpacity:1.0];
[layer setMasksToBounds:NO];
于 2013-01-30T12:45:38.407 回答