1

ここの質問で説明したように、CAGradientLayer を使用して UITableView の背景色を設定しようとしました。このようなNSMutableArrayのいくつかの値をUITableViewに入力しています...

- (void)viewDidLoad
{
    // ....
    if (!navigationItems) {
        navigationItems = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", nil];
    }

}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithRed:213.0f/255.0f green:91.0f/255.0f blue:92.0f/255.0f alpha:1.0f] CGColor][[UIColor colorWithRed:213.0f/255.0f green:0.0f blue:0.0f alpha:1.0f] CGColor], nil];
    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.colors = colors;
    gradientLayer.frame = tableView.bounds;

    [tableView.layer insertSublayer:gradientLayer atIndex:0];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    cell.textLabel.text = [navigationItems objectAtIndex:indexPath.row];
    cell.textLabel.textColor = [UIColor blackColor];

    return cell;
}

何が起こるかというと、初期値が取り込まれているセルが、設定したグラデーション カラーと重なっているように見えます。これらのセル (この場合、値1が 、2、のセル) にはテキスト/境界線は表示されません。ここで何が間違っているのですか?34

4

2 に答える 2

1

方法にinsertSublayer注意!セルがリサイクルされるたびに、新しいレイヤーを挿入しています。したがって、数回繰り返した後、セル内にレイヤーがたくさんあります。

これを避けるには、毎回次のように単純なループを実行します。

for (CALayer *layer in [cell.barView.layer.sublayers reverseObjectEnumerator]) {
    if ([layer isKindOfClass:[CAGradientLayer class]]) {
        [layer removeFromSuperlayer];
        break;
    }
}
于 2012-06-19T12:44:28.030 に答える