为什么cellForRowAtIndexPath有时会添加gradientLayer?

时间:2012-06-02 22:52:37

标签: uitableview

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

- (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];
}

1 个答案:

答案 0 :(得分: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