11

私は、estimatedHeightForRowAtIndexPath を使用するときの驚くべき問題または直観に反する動作を発見しました

(1) テーブルの行の高さが大きく異なります。最終結果は、111 から約 400 の範囲になります。

(2) 各行の高さを完全に計算します。私はこれらを配列で手元に持っています。つまり、キャッシュされています。

{これはまさに、Apple エンジニアが現在推奨していることに注意してください...例、ポイント 5 .. UITableView で自動レイアウトを使用して、動的なセル レイアウトと可変行の高さを実現する}

(3) heightForRowAtIndexPath が高さを要求する場合、絶対に正しい高さを指定します。

(4) セルを構築するときは、正確に正しい高さに構築します ((2) と (3) のように)。

{注 - もちろん、最終的にセルの高さを調整するのは iOS であり、「私」ではありません。}

これはすべて完璧に機能します。

つまり、各セルは iOS によって、heightForRowAtIndexPath で指定された正確な高さで構築されます。

さて、コードを追加します...

-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 120;
}

実際、テーブルはもはや機能しません.... 行の高さがランダムになります!!!

この信じられない行動を見た人はいますか?

私はさまざまなテストを行って、推定されたHeightForRowAtIndexPathが何をするのかの関係を判断しようとしました。最初は、高さの下限を提供するのではないかと考えました。したがって、150 .. 私の小さなセルでさえ、誤って 150 の高さになります。しかし、そうではありません。

私はそれがこのようなことをしているかもしれないと思います:あなたの推定されたHeightForRowAtIndexPath値が150であるとしましょう.行に150を使用している場合があります(実際には()がそのサイズ以下であることが証明されていますが、heightForRowAtIndexPathから実際のサイズになる場合もあります.

一方、推定された高さの値よりも小さい値を入れた場合 (私の例では 100 とします)、ほとんど「まったく機能しません」細胞。

非常に高いセルは正しく機能しているようです。おそらく、「heightForRowAtIndexPath からの高さが推定値の 2 倍の場合、実際の高さを使用します」のようなものです。

明確にするために、セルが小さすぎることはないようですが、セルが大きくなりすぎることがよくあります。

明確にするために、私は自動レイアウトを使用していません。これは、作成する必要があるセルのタイプです。(残念ながら、これが autolayout でどのように機能するかわかりません。) これは Xcode5/iOS7+ のみです。

4

2 に答える 2

18

更新された回答

さらに調査した結果、「単に自動レイアウトが必要です」が間違っていることがわかりました。自動レイアウトが必要だったのは私のサンプル コードでした。にわずかな変更を加えたDynamicHeightCellところ、自動レイアウトの有無にかかわらず機能するようになりました。

元の回答

単に自動レイアウトが必要です。驚くべきことではありませんが、絶対に文書化する必要があります。

tableView:estimatedHeightForRowAtIndexPath:これは、自動レイアウトで正しく動作することを示す作業中のプロジェクトです。ストーリーボードで自動レイアウトをオフにすると、説明したとおりに動作します。

行の推定高さのデモ

于 2013-12-05T17:00:38.880 に答える
1
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { }

このデリゲート メソッドは通常、多数の動的セルがある場合に使用され、セルの大まかな見積もりを提供します。

例: 各高さが 200 から 300 の範囲 (例: 201、207、250、299、300...) のセルが 100 個ある場合、セルの高さは約 250 と見積もることができます。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 250;
}
  • 行の高さの見積もりを提供すると、テーブル ビューをロードするときのユーザー エクスペリエンスを向上させることができます。
  • このデリゲートが実装されていない場合、すべての高さを計算するとコストがかかり、読み込み時間が長くなる可能性があります。
于 2015-05-20T08:36:09.660 に答える