0

私はCALayerを使用して、uitableviewcellをよく見ています。私はこれを次のようにしようとしています:

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メソッドでそれをやっています

ただし、複数回呼び出されるため(セルがロードまたは再ロードされるたびに)、セルにさらに多くの輝きレイヤーが追加されます。これを回避する1つの方法は、セルが初めて使用されるかどうかを確認することです。この場合、セルを作成して輝きを追加する必要があります。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

一般的な UITableViewCell を使用する代わりに、カスタム セル サブクラスを作成し、drawRect: メソッドに効果を追加することができます。あなたのコードには、シャイン効果がセルのデータに反応する必要がないことを示唆するものは何も見当たりません。そのため、セル オブジェクトがインスタンス化されるときに効果を作成することもできます。これは、cellForRowAtIndexPath で行うよりもわずかに効率的です。

于 2012-09-05T22:42:56.917 に答える