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);