将CALayer用于UITableViewCell

时间:2012-09-05 18:45:55

标签: iphone ios uitableview calayer cell

我正在使用CALayer来了解我的uitableviewcells。我试图这样做:

CALayer *btnLayer = [cell layer];
[btnLayer setMasksToBounds:YES];
[btnLayer setCornerRadius:10.0f];

[btnLayer setBorderWidth:5.0f];
[btnLayer setBorderColor:[[UIColor blackColor] CGColor]];

CAGradientLayer *shineLayer = [CAGradientLayer layer];
shineLayer.frame = btnLayer.bounds;
shineLayer.colors = [NSArray arrayWithObjects:
                     (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                     (id)[UIColor colorWithWhite:1.0f alpha:0.2f].CGColor,
                     (id)[UIColor colorWithWhite:0.75f alpha:0.2f].CGColor,
                     (id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor,
                     (id)[UIColor colorWithWhite:0.3f alpha:0.4f].CGColor,
                     nil];
shineLayer.locations = [NSArray arrayWithObjects:
                        [NSNumber numberWithFloat:0.0f],
                        [NSNumber numberWithFloat:0.5f],
                        [NSNumber numberWithFloat:0.5f],
                        [NSNumber numberWithFloat:0.8f],
                        [NSNumber numberWithFloat:1.0f],
                        nil];
[btnLayer addSublayer:shineLayer];

我在tableViewController的cellForRowAtIndexPath方法中执行此操作。所有的作品都很完美,细胞发光很好但是当我自上而下拖动细胞几次时,顶部和底部细胞再次重新绘制。之后,细胞变得更轻。

我使用动态单元格并从数组加载数据。给我一个建议,如何做到正确。

由于

2 个答案:

答案 0 :(得分:1)

  

我正在使用cellForRowAtIndexPath方法

但由于它被多次调用(每次单元格加载或重新加载),您都会向单元格添加越来越多的光泽层。避免这种情况的一种方法是检查它是否是第一次使用单元格 - 在这种情况下,您必须创建并添加光泽。因此,您可以将您拥有的整个代码包装到检查可出列单元格的同一if分支中:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellID"];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStylePlain reuseIdentifier:@"CellID"] autorelease];

    // ADD THE SHINE CODE HERE
}

// and **not** here!

return cell;

答案 1 :(得分:0)

您可以创建自定义单元子类并在drawRect:方法中添加效果,而不是使用通用UITableViewCell。我在代码中看不到任何暗示光照效果需要对单元格数据作出反应的内容,因此您也可以在实例化单元格对象时创建效果。这应该比在cellForRowAtIndexPath中更有效: