iOS UITableView:usingCAGradientLayer导致初始对象不出现在表视图中

时间:2012-04-19 10:11:49

标签: ios uitableview cagradientlayer

正如我在问题here中所讨论的那样,我尝试使用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;
}

使用初始值填充的单元格似乎与我设置的渐变颜色重叠。这些单元格中不显示文字/边框(在这种情况下,值为1234的单元格。我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

将tableView设置为tableView对我有用。我是这样做的:

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = colors;
gradientLayer.frame = tableView.bounds;

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

UIView *tableBackgroundView = [[UIView alloc] init];
[tableBackgroundView.layer insertSublayer:gradientLayer atIndex:0];
[self.tableView setBackgroundView:tableBackgroundView];

答案 1 :(得分:1)

注意insertSublayer方法!每次回收单元格时都要插入新图层。因此,经过几次迭代后,您将在单元格内部拥有一堆图层。

为避免这种情况,请每次都运行一个简单的循环:

for (CALayer *layer in [cell.barView.layer.sublayers reverseObjectEnumerator]) {
    if ([layer isKindOfClass:[CAGradientLayer class]]) {
        [layer removeFromSuperlayer];
        break;
    }
}