で動的な値を使用すると、パフォーマンスの問題が発生しますheightForRowAtIndexPath:
(静的な値を設定すると応答性が大幅に向上するため、この方法であることはわかっています)。私のテーブルには約 3000 個のセルが含まれています。
動的な値を使用するとパフォーマンスが低下する理由は理解できますが (主に、データを表示する前に、メソッドの計算をテーブル内のセルごとに 1 回実行する必要があるため)、より効率的にする方法がわかりません。 .
私が遭遇した同様の質問の多くで、提案された解決策は、NSString
のsizeWithFont
メソッドを使用しheightForRowAtIndexPath:
て高速化することでした。私は現在それを行っていますが、テーブルのロードにはまだ約1.5秒かかります(およびリロードは、やや頻繁に行われます)。これは長すぎるため、最適化する必要があります。
私が現在使用しているコード (少なくともその本質) は以下のとおりです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell;
UILabel *label = nil;
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
label = [[UILabel alloc] initWithFrame:CGRectZero];
// set up label..
[[cell contentView] addSubview:label];
}
NSDictionary *dict = alphabetDict; //dictionary of alphabet letters (A-Z). each key contains an NSArray as its object
CGFloat rightMargin = 50.f; //padding for the tableview's index titles
NSString *key = [[[dict allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section];
NSArray *array = [dict objectForKey:key];
NSString *cellText = [array objectAtIndex:indexPath.row];
//TABLE_WIDTH is 268.f, CELL_MARGIN is 14.f
CGSize constraintSize = CGSizeMake(TABLE_WIDTH - (CELL_MARGIN * 2) - rightMargin, 20000.0f);
CGSize labelSize = [cellText sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake(CELL_MARGIN, CELL_MARGIN, TABLE_WIDTH - (CELL_MARGIN * 2) - rightMargin, labelSize.height)];
[label setText:cellText];
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
//TODO make this faster
NSDictionary *dict = alphabetDict;
CGFloat rightMargin = 50.f;
NSString *key = [[[dict allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section];
NSArray *array = [dict objectForKey:key];
NSString *cellText = [array objectAtIndex:indexPath.row];
CGSize constraintSize = CGSizeMake(TABLE_WIDTH - (CELL_MARGIN * 2) - rightMargin, 20000.0f);
CGSize labelSize = [cellText sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height + (CELL_MARGIN * 2) + 16.f;
}
このコードをさらに合理化するために、誰かが私を正しい方向に向けることができますか? ありがとう!