3

这是我用来生成 UITableViewCell 的代码。我正在 iOS6/iOS7 中进行测试。如果我删除有关 UIImageView 的代码 UITableView 滚动就好了。但是使用 UIImageView 它会滞后和痉挛。我正在寻找一些解决方案来解决滞后问题。先感谢您。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"BubbleCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UILabel *label;
        UIImageView *bubbleLeft;
        UIImageView *bubbleRight;

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

            label = [[UILabel alloc] init];
            label.tag = 1;

            NSString *fileLeft = [[NSBundle mainBundle] pathForResource:@"chatBubbleGray.png" ofType:nil];
            NSString *fileRight = [[NSBundle mainBundle] pathForResource:@"chatBubbleBlue.png" ofType:nil];

    UIImage
    *bubbleImageLeft = [[
    UIImage imageWithContentsOfFile:fileLeft] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)];

    UIImage
    *bubbleImageRight = [[
    UIImage imageWithContentsOfFile:fileRight] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)];

            bubbleLeft = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 10, 10)];
            [bubbleLeft setImage:bubbleImageLeft];
            bubbleLeft.tag=2;
            bubbleRight = [[UIImageView alloc] initWithFrame:CGRectMake(320 - 20, 10, 10, 10)];
            [bubbleRight setImage:bubbleImageRight];
            bubbleRight.tag=3;

            [cell addSubview:bubbleLeft];
            [cell addSubview:bubbleRight];
            [cell addSubview:label];

        }else{
            label = (UILabel *)[cell viewWithTag:1];
            bubbleLeft = (UIImageView *)[cell viewWithTag:2];
            bubbleRight = (UIImageView *)[cell viewWithTag:3];
        }


    // set frame to largest size you want

        label.numberOfLines = 0;
        label.
    backgroundColor = [UIColor clearColor];
        label.
    text
    = [[[
    currentDictionary objectAtIndex:indexPath.row] objectForKey:@"string"] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];

        CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

        CGSize expectedLabelSize = [label.text sizeWithFont:label.font constrainedToSize:maximumLabelSize lineBreakMode:label.lineBreakMode];

        if (indexPath.row%2==0) {
            bubbleRight.hidden = YES;
            bubbleLeft.hidden = NO;
            bubbleLeft.frame = CGRectMake(10, 10, expectedLabelSize.width+20, expectedLabelSize.height+20);

            label.frame = CGRectMake(
                                     20, 20,
                                     expectedLabelSize.width, expectedLabelSize.height);

        }else{
            bubbleLeft.hidden = YES;
            bubbleRight.hidden = NO;

            bubbleRight.frame = CGRectMake(320 - expectedLabelSize.width - 30, 10, expectedLabelSize.width+20, expectedLabelSize.height+20);

            label.frame = CGRectMake(
                                     320 - expectedLabelSize.width - 20, 20,
                                     expectedLabelSize.width, expectedLabelSize.height);
        }



    // Configure the cell...

        return cell;
    }

编辑:

进一步查看代码表明,滞后实际上是由这段代码引起的: bubbleLeft.frame = CGRectMake(10, 10, expectedLabelSize.width+20, expectedLabelSize.height+20);

4

2 回答 2

2

正如我之前所说,resizableImage 似乎导致了滞后。问题是我试图使用这段代码:

UIImage imageWithContentsOfFile:fileLeft] resizableImageWithCapInsets:UIEdgeInsetsMake(20, 22, 20, 22)];

对于一个图像

47x36.

这意味着我的帽子是负面的,翻转可拉伸的部分会导致滞后。作为进一步的信息,resizableImageWithCapInsets:可以通过保留1px x 1px可拉伸区域来调整大小来实现最佳性能。

于 2013-10-05T20:35:52.020 回答
1

您可以做的一件简单的事情是创建您的UIImagesusingimageNamed:而不是imageWithContentsOfFile:. imageNamed:通常只会从第一个磁盘加载图像然后缓存它,而每次imageWithContentsOfFile:都会输出到磁盘。

如果这不能让您获得所需的性能,您可能必须将图像加载过程移动到不同的执行线程。

于 2013-10-04T16:08:06.707 回答