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

できる簡単なことの 1 つは、ではなくUIImagesusingを作成することです。 は通常、ディスク 1 からのみイメージをロードしてキャッシュしますが、毎回ディスクに移動します。imageNamed:imageWithContentsOfFile:imageNamed:imageWithContentsOfFile:

求めているパフォーマンスが得られない場合は、イメージの読み込みプロセスを別の実行スレッドに移動する必要がある場合があります。

于 2013-10-04T16:08:06.707 に答える