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

除了此处的其他优化建议外,指定 ashadowPathCALayer提高阴影绘制性能。你可以用这样的东西确定阴影的路径......

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

您可能还想查看shouldRasterizeCALayer 上的相关信息。这会导致图层被预渲染为位图。如果您走这条路线,请确保还提供与您的设备匹配的 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 回答