コンテンツに応じて可変サイズになる UITableView セルがあります (数行のテキストになる可能性があります)。
セルをレイアウトする前にheightForRowAtIndexPath が呼び出されているように見えるので、テキスト文字列で [NSString sizeWithFont] を呼び出して正しい高さを推測します。セル内にテキストをレイアウトし、正確なサイズを把握した後に高さを設定するより良い方法はありますか?
コンテンツに応じて可変サイズになる UITableView セルがあります (数行のテキストになる可能性があります)。
セルをレイアウトする前にheightForRowAtIndexPath が呼び出されているように見えるので、テキスト文字列で [NSString sizeWithFont] を呼び出して正しい高さを推測します。セル内にテキストをレイアウトし、正確なサイズを把握した後に高さを設定するより良い方法はありますか?
ばかげているように聞こえるかもしれませんが...ええと...「heightForRowAtIndexPathを終了する前にセルをレイアウトしてください」;)
真面目な話ですが、OS は必要な場合にのみこれを呼び出します (たとえば、セルを作成して画面に表示しようとしている場合など)。
論理的に、レイアウトを個別に行う必要はないことに注意してください。heightForRowAtIndexPath ルーチン内で [self prepLayoutForCellAtIndex:index] を呼び出すだけです。
データが静的な場合は、高さテーブルを作成して情報をキャッシュできます。
if (0 == heightTable[index]) {
heightTable[index] = [self prepLayoutForCellAtIndex:index];
}
return (heightTable[index]);
データが変更された場合でも、データを変更するメソッドでテーブル値を再計算するか、0 にクリアして、次に必要になったときに再計算されるようにすることができます。
私は通常、次のものを使用します。
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {
UITableViewCell *cell = [self tableView: tableView cellForRowAtIndexPath: indexPath];
return cell.bounds.size.height;
}
これは、大量のセルを持つテーブルではなく、事前に一連の行を事前にキャッシュするテーブルに使用することに注意してください。ただし、設定テーブルのように数行しかないものの、サイズが大きく異なる可能性が高いものについては、うまく機能します。より大きなテーブルの場合、Olie が提案したことに沿って何かを行います。
例として SMS.app を見ると、Apple はセルの行の高さを SMS.app sqlite データベースに保存します。