5

UITableViewCell の背景に境界線の色とドロップ シャドウを追加する次のコードがあります。私の問題は、このコードが tableView 自体に大きな遅延を引き起こすことです。

UITableView の遅延を防止してコードを最適化する方法を教えてください。

if ([cell viewWithTag:012] == nil && comment.isReply == NO) {
    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease];
    [iv setImage:[UIImage imageNamed:@"paper"]];
    [iv setTag:012];
    [cell insertSubview:iv atIndex:0];

    [iv.layer setBorderWidth:1.0];
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]];

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]];
    [iv.layer setShadowOffset:CGSizeMake(0, 1)];
    [iv.layer setShadowOpacity:0.75];

}

else if ([cell viewWithTag:012] == nil && comment.isReply == YES) {

    frame.origin.x += 35;

    UIImageView *iv = [[[UIImageView alloc] initWithFrame:frame] autorelease];
    [iv setImage:[UIImage imageNamed:@"paper"]];
    [iv setTag:012];
    [cell insertSubview:iv atIndex:0];

    UIImage *arrow = [UIImage imageNamed:@"arrow"];
    UIImageView *ivs = [[[UIImageView alloc] initWithFrame:CGRectMake(-12, ([cell frame].size.width / 2) + ([arrow size].width/2) , arrow.size.width, arrow.size.height)] autorelease];
    [cell addSubview:ivs];

    [iv.layer setBorderWidth:1.0];
    [iv.layer setBorderColor:[[UIColor whiteColor] CGColor]];

    [iv.layer setShadowColor:[[UIColor blackColor] CGColor]];
    [iv.layer setShadowOffset:CGSizeMake(0, 0)];
    [iv.layer setShadowOpacity:0.75];

}
4

2 に答える 2

20

ここでの他の最適化アドバイスに加えて、 を指定すると、影の描画パフォーマンスが向上shadowPathします。CALayerこのようなもので影のパスを決定できます...

iv.layer.shadowPath = [UIBezierPath bezierPathWithRect:iv.bounds].CGPath;

shouldRasterizeまた、CALayerのビットを調べることもできます。これにより、レイヤーがビットマップとして事前にレンダリングされます。このルートに進む場合は、デバイスに一致する rasterizationScale も提供してください。

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
于 2011-11-30T23:54:58.930 に答える
1

ロードのたびにセルを操作するのは避けてください。代わりに、セルの初期化/作成時に UI を調整する必要があります。

説明すると、スクロールするたびにメソッドを使用して新しいセル (または複数) をロードできますcellForRowAtIndexPath:。現在、このメソッドで多くのビューの変更を行っていますが、これが必要ない場合もあります (たとえば、新しいセル画面外にスクロールしたものと同じタイプです)。この UI の変更を、データがスワップされる場所ではなく、セルが初期化される場所に移動します。サブクラスでこれを行うか、単にこのようにすることができます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Reuse id
    static NSString *identifier1 = @"identifer-1";
    static NSString *identifier2 = @"identifier-2";
    static NSString *regular = @"regular";

    UITableViewCell *cell;

    if (comment.isReply == NO) {
        cell = [tableView dequeueReusableCellWithIdentifier: identifier1];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier1] autorelease];

            // Do the UI modification here
        }
    } else if (comment.isReply == YES) {
        cell = [tableView dequeueReusableCellWithIdentifier: identifier2];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: identifier2] autorelease];

            // Do the UI modification here
        }
    } else {
        // Regular cell
        cell = [tableView dequeueReusableCellWithIdentifier: regular];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: regular] autorelease];
        }
    }

    // Load the data into the cell

    return cell;
}

これで目的が達成されることを願っています。重要なのは、重い作業をできるだけ少なくし、UITableView キャッシュの効果を高めることです。

于 2011-11-30T23:26:28.640 に答える