制約があいまいに高さゼロを示唆しているケースを検出しました 質問する

制約があいまいに高さゼロを示唆しているケースを検出しました 質問する

Xcode 6.1 ベータ 2 にアップデートした後、テーブルビュー セルを含むアプリを実行すると、デバッグ アシスタントに次のように表示されます。

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

以前、このプロジェクトで Xcode 5 を使用したときに、いくつかのエラーが発生していましたが、アップグレードしてからは発生しなくなりました。現在は他のエラーや警告はありません。すべてのテーブルビュー セルのサイズを調整し、標準の高さも使用してみましたが、それでも同じ警告が表示されます。

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

私もこれに関する同様のトピックをすべて読みましたが、どの解決策も役に立ちませんでした。シミュレーターでアプリをテストすると、tableView セルにあるはずの画像が存在しないことを除けば、アプリは正常に動作します。

ベストアンサー1

iOS8 の Tableviews の素晴らしい新機能「行の高さの自動調整」の副作用が発生しています。

iOS 7 では、行のサイズを固定するか ( で設定tableView.rowHeight)、セルの高さを計算するコードを記述して、その結果を で返すかのtableView:heightForRowAtIndexPathいずれかでした。セル内に多数のビューがあり、フォント サイズごとに異なる高さを考慮する必要がある場合は、セルの高さを計算するコードを記述するのは非常に複雑になる可能性があります。Dynamic Type を追加すると、プロセスは非常に面倒になります。

iOS 8 でも、上記の操作は引き続き実行できますが、セルのコンテンツを Auto Layout を使用して構成しておけば、行の高さは iOS によって決定されます。これは開発者にとって大きなメリットです。動的なフォント サイズが変更されたり、ユーザーがアクセシビリティ設定を使用してテキスト サイズを変更したりすると、UI が新しいサイズに適応できるからです。また、複数行のテキストを持つことができる UILabel がある場合、セルは必要に応じてセルに合わせて拡大し、必要がない場合は縮小できるため、不要な空白がなくなります。

表示されている警告メッセージは、自動レイアウトがテーブルビューにセルの高さを通知するための制約がセル内に十分にないことを通知しています。

動的セルの高さを使用するには、他の投稿者がすでに言及しているテクニックとともに、このメッセージも取り除くことができますが、セルにUIアイテムを上部にバインドするための十分な制約があることを確認する必要があります。そして底セルの。以前に自動レイアウトを使用したことがある場合は、おそらく Top + Leading 制約の設定に慣れているでしょうが、動的な行の高さには bottom 制約も必要です。

レイアウト パスは次のように動作し、セルが画面に表示される直前にジャストインタイム方式で実行されます。

  1. 固有のサイズを持つコンテンツの寸法が計算されます。これには UILabels と UIImageViews が含まれ、これらの寸法はそれぞれ含まれるテキストまたは UIImages に基づきます。これらのビューは両方とも、幅が既知であるとみなします (後端/前端の制約を設定しているか、明示的に幅を設定しているか、最終的に左右の幅を明らかにする水平制約を使用しているため)。ラベルにテキストの段落があるとします (「行数」が 0 に設定されているため、自動的に折り返されます)。幅は 310 ポイントまでしか設定できないため、現在のフォント サイズでは高さが 120 ポイントであると判断されます。

  2. UI は、配置制約に従ってレイアウトされます。ラベルの下部には、セルの下端余白に接続する制約があります。ラベルの高さが 120 ポイントにまで大きくなり、制約によってセルの下部にバインドされているため、「ラベルの下部は常にセルの下部から標準距離である」という制約を満たすために、セルを「下」に押し下げる (セルの高さを増やす) 必要があります。

あなたが報告したエラー メッセージは、その下部制約が欠落している場合に発生します。その場合、セルの下部をセルの上部から「押し出す」ものが何もないため、報告された曖昧さが発生します。つまり、下部を上部から押し出すものが何もないため、セルは折りたたまれます。ただし、自動レイアウトはそれを検出し、標準の行の高さを使用します。

参考までに、そして主に包括的な回答を得るために、iOS 8 の Auto Layout ベースの動的な行の高さを実装する場合は、 を実装する必要がありますtableView:estimatedHeightForRowAtIndexPath:。その推定メソッドは、セルのおおよその値を使用でき、テーブルビューが最初に読み込まれたときに呼び出されます。これは、スクロールバーなどのものを UIKit が描画するのに役立ちます。スクロールバーは、テーブルビューがスクロールできるコンテンツの量を認識していないと描画できませんが、スクロールバーだけなので、完全に正確なサイズは必要ありません。これにより、実際の行の高さの計算は、セルが必要になる瞬間まで延期されるため、計算負荷が軽減され、UITableView をより迅速に表示できます。

おすすめ記事