0

我正在使用 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 方法中执行此操作。一切都很完美,单元格发光很好,但是当我自上而下拖动单元格几次时,顶部和底部单元格再次重绘。之后细胞变得更轻。

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

谢谢

4

2 回答 2

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;
于 2012-09-05T18:52:45.197 回答
0

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

于 2012-09-05T22:42:56.917 回答