web-dev-qa-db-ja.com

EstimatedHeightForRowAtIndexPathは、実際に行の最終的な「正しい」高さを変更できますか?

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

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

誰かがこの信じられないほどの行動を見たことがありますか?

地獄のestimatedHeightForRowAtIndexPathが行うことの関係を判断するために、さまざまなテストを行いました。最初は、高さの下限になるのではないかと思いました。したがって、150 ..私の小さなセルでさえ誤って150の高さになります。しかし、そうではありません。

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

一方、実際に存在するよりも小さいestimatedHeightForRowAtIndexPathの値(私の例では100など)を入力すると、ほとんど「まったく機能しません」、ランダムな高さでしか見えないものが得られます。細胞。

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

明確にするために、それはセルを小さくしすぎることは決してないようですが、しばしばそれらを大きくしすぎます。

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

11
Fattie

更新された回答

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

元の回答

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

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

推定行高デモ

18
Timothy Moose
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { }

このデリゲート方式は通常、動的セルが多数ある場合に使用され、セルの概算を提供します。

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

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