0

次のような関数があります。

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

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

したがって、基本的には、行 4 と 5 のみがグラデーションの背景を持つ必要があります。テーブルビューが最初にロードされると、行 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 に答える