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)、4 番目のセルが最初のセルと同じ色になることです。

この問題を管理する方法はありますか? ありがとう

更新 UITableViewController からカスタム再描画メソッドを呼び出そうとしましたが、「null」コンテキスト エラーが発生しました

- (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セッターでsetNeedsDisplayを呼び出して、強制的に再描画する必要があります。

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

resueIdentifier is ;のように、first cellと をother cells異なるものにすることができると思います。s resueIdentifier は、カスタム セルでマークを作成し、 メソッドで両方のタイプのセル使用ステートメントを描画できます。identifierfirst cell@"first"other cells@"others"BOOL _isFirstCellfirst cell- (void)drawRect:(CGRect)rectif 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]];単純な色と影だけが必要な場合は、使用しないでください。

編集: Guo Luchuanが言ったように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 に答える