0

我有一个看起来像这样的函数:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// instantiate the cell

if(indexPath.row >=4 && indexPath.row <=5)
{
[CustomTableCell addGradient];
}
}

所以基本上,只有第 4 行和第 5 行应该有渐变背景。当 tableview 首次加载时,只有第 0 到 4 行是可见的,并且没有完美的渐变背景。当我向下滚动一点以查看第 4 行和第 5 行时,渐变出现在它们上面,这再次很棒。但是当我向上滚动到第一行时,突然间我在第一行看到了一个渐变!!!但我从未要求第 0 行有渐变!此外,当我向下滚动一点时,我看到渐变应用于某些行而不是其他行。为什么会这样?

这是有用的 addGradient 函数:

- (void) addGradient
{
    if([self.layer.sublayers count] >0)
    {
        if([[self.layer.sublayers objectAtIndex:0] isKindOfClass:[CAGradientLayer class]])
            return;
    }

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.bounds;

    gradient.colors = [NSArray arrayWithObjects:(id)[UIColor blueColor].CGColor, (id)[UIColor redColor].CGColor, nil];

    [self.layer insertSublayer:gradient atIndex:0];
}
4

1 回答 1

0

我刚刚意识到 iPhone/cocoa 实际上是在为 cellForRowAtIndexpath 重新使用内存中的现有单元格来绘制出现在屏幕上的单元格。所以这就是为什么单元格仍然有一个我之前设置的渐变层。因此,我使用以下代码更新了我的 stylecell 函数以删除层(如果存在):

- (void) styleCell
{
    if([self.layer.sublayers count] >0)
    {
        if([[self.layer.sublayers objectAtIndex:0] isKindOfClass:[CAGradientLayer class]])
        {
            [[self.layer.sublayers objectAtIndex:0] removeFromSuperlayer];
//            return;
        }
    }

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.bounds;

    gradient.colors = [NSArray arrayWithObjects:(id)[UIColor blueColor].CGColor, (id)[UIColor redColor].CGColor, nil];


    [self.layer insertSublayer:gradient atIndex:0];
}
@end
于 2012-06-03T09:54:54.280 回答