テーブルビューに大きなplistファイルをロードするアプリがあります。このplistファイルは本としてのものです。章と行が含まれています。各行の長さは行の長さによって異なるため、セルのサイズを自動的に変更する必要があります。
ストーリーボードと標準のテーブルビューとセルを使用しています。セルstyle=basicで、セルラベルはtext = plain lines = 0 linebreaks=wordwrapに設定されています
そこまでは、セルの高さを適切なサイズに変更しても問題ありません。テキストがラベルに挿入される前にセルの高さが定義されるので、CGsizeを使用するよく知られた方法でそれを行う必要があり、私はそのようにします(正常に機能しています)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:
(NSIndexPath*)indexPath
{
NSUInteger section = [indexPath section];
NSString *key = [chapters objectAtIndex:section];
NSArray *linesSection = [lines objectForKey:key];
NSString* theText = [linesSection objectAtIndex:indexPath.row];
int labelWidth = LW_CHAPTERINDEX_10;
if (chapters.count < 100){
if (chapters.count < NB_MIN_CHAP){
labelWidth = LABELWIDTH;
} else {
labelWidth = LW_CHAPTERINDEX_10;
}
}
CGSize textSize = [theText sizeWithFont:[UIFont systemFontOfSize:14]
constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT)
lineBreakMode:UILineBreakModeWordWrap];
return textSize.height;
}
問題は、インデックスに応じたハードコーディングです。今のところ私は3つの可能性があります。
- インデックスなし
- 10未満の数字のインデックス
- 100未満の数値のインデックス
そしてコードではこの部分
int labelWidth = LW_CHAPTERINDEX_10;
if (chapters.count < 100){
if (chapters.count < NB_MIN_CHAP){
labelWidth = LABELWIDTH;
} else {
labelWidth = LW_CHAPTERINDEX_10;
}
}
3つの可能性に応じたハードコーディングです。
特にアップルがより多くの異なる画面サイズを提供し始める場合、これは奇妙なことでした。
質問
実行時にインデックス幅を取得してラベル幅を決定するにはどうすればよいですか?
たとえば、ラベルの幅を取得するためにscreen.width--index-widthのようなプログラムを作成したいと思います。
または、動的で静的にハードコーディングされないようにする必要があるその他の機能。