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


120

Xview 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セルにあるはずの画像がない場合を除いて、アプリは正常に実行されます。


2
コレクションビューのセルでも同じエラーが発生します。私はこれのために何をしますか。助言がありますか。
python

おそらく、ターゲットにxibファイルが既に追加されているかどうかを確認する必要がありますstackoverflow.com/a/26870331/1418457
onmyway133 '11 / 11/14


これはiOS 8.1では発生しましたが、iOS 8.4では発生しなくなりました。高さを指定した場合、それは単なるXcodeのバグだと思います。
samwize 2015

回答:


126

これまでに3つのことがこの警告を沈黙させてきました。あなたにとって最も便利なものを選ぶことができます。何もきれいです。

  • viewDidLoadでデフォルトのセルの高さを設定するには

    self.tableView.rowHeight = 44;
  • ストーリーボードに移動し、テーブルビューの行の高さを44以外の値に変更します。

  • テーブルビューのデリゲートメソッドheightForRowAtIndexPathを実装するには

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }
    

変だ。


私もあなたのメソッドを使用してみましたが、rowHeightに@propertyを追加する必要がありますが、使用する正しいオブジェクトタイプがわかりません
David E

私はあなたのメモを得られなかったかもしれませんが、rowHeightはUITableViewのプロパティです。テーブルをコンセントに接続するだけです。
Viktor Kucera 2014

4
これは、44ptの値をIBのままにしておくと、セルフサイズセルを使用することを検討するためです。stackoverflow.com/questions/25888126/…(しかし、はい、これは確かに奇妙な動作です)
Guillaume Algis '19

どうやら私には2つのviewDidLoadメソッドがありself.tableView.rowHeight = 44;、間違ったメソッドに入れました。エラーは消えました!おかげで
デビッドE

これをより明確にしてくれたGuillaume Algisに感謝します。それでもまだ非常に気味が悪いです。
Viktor Kucera

216

iOS8のテーブルビューの素晴らしい新機能である自動行の高さの副作用が発生しています。

iOS 7では、固定サイズ(で設定tableView.rowHeight)の行があるか、セルの高さを計算するコードを記述して、それをで返しますtableView:heightForRowAtIndexPath。セルに多数のビューがあり、異なるフォントサイズで異なる高さを検討する場合、セルの高さを計算するためのコードの記述は非常に複雑になる可能性があります。動的タイプを追加すると、プロセスはお尻の痛みでした。

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

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

動的なセルの高さを使用すると、他のポスターですでに言及されている手法と同様に、このメッセージが表示されなくなります。セルにUIアイテムをセルの上部と下部にバインドするための十分な制約があることを確認する必要があります。以前にAuto Layoutを使用したことがある場合は、おそらくTop + Leading制約の設定に慣れていますが、動的な行の高さには下部の制約も必要です。

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

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

  2. UIは、配置の制約に従ってレイアウトされます。セルの下部マージンに接続するラベルの下部に制約があります。ラベルは120ポイントの高さに成長し、制約によってセルの下部にバインドされているため、「bottom of」という制約を満たすために、セルを「下」に押す(セルの高さを上げる)必要があります。ラベルは常にセルの下部からの標準距離です。

報告したエラーメッセージは、その下部の制約が欠落している場合に発生します。その場合、セルの上部からセルの下部を「プッシュ」するものはありません。これは、報告されているあいまいさです。上、セルが折りたたまれます。ただし、自動レイアウトもこれを検出し、標準の行の高さを使用するようにフォールバックします。

何に価値があるのか​​、ほとんどの場合丸められた答えを得るために、iOS 8の自動レイアウトベースの動的行の高さを実装する場合は、を実装する必要がありますtableView:estimatedHeightForRowAtIndexPath:。その推定メソッドはセルに大まかな値を使用でき、テーブルビューが最初に読み込まれたときに呼び出されます。これは、UIKitがスクロールバーのようなものを描画するのに役立ちます。これは、テーブルビューがスクロールできるコンテンツの量を知らない限り描画できませんが、単なるスクロールバーなので、完全に正確なサイズは必要ありません。これにより、実際の行の高さの計算を、セルが必要になる瞬間まで延期することができます。これにより、計算負荷が軽減され、UITableViewがより速く表示されます。


3
これは、この警告の根本的な理由の素晴らしい説明です。ウッドスター、あなたの時間はたくさんあります!
Golden Thumb

4
ウッドスターが言ったように、私は制約の.Bottom部分を逃しました。追加すると問題が解決しました。
Golden Thumb

ほぼ20のことを試した後、これが機能した唯一のものです!
フリオロドリゲス

この男はそれを釘付けにした!彼はそれに値し、賛成票を投じ、これは受け入れられた答えでなければなりません。+1
カリブ海2015年

1
制約が欠落しているセルを特定するには、この回答stackoverflow.com/a/29565073/4080860を参照してください。
hhanesand 2015

11

カスタムUITableViewCellを作成し、サブビューをセルではなくセルに追加した後、この問題が発生しましたcontentView


10

プログラムによる方法なしでこれを解決するには、ストーリーボードからサイズインスペクターでテーブルビューの行の高さを調整します。

ここに画像の説明を入力してください


コードの行の代わりにストーリーボードのものを使用しているので、私にとって最適なソリューションです。
zyc

6

これは自動レイアウトの問題です。サブビューにすべての制約があることを確認してください。私にとって、セルのタイトルラベルの下部の制約がありませんでした。私がそれを追加したとき、警告は消え、すべてが完全に現れました。


これが完全に良い答えであるため、これがなぜ反対票を投じられたのかわからない。セルは、問題を持つことがレイアウトされている考え出すのヘルプはこちらを参照してくださいstackoverflow.com/a/29565073/4080860
hhanesand

5

セルフサイズ表のセルを有効にするだけ

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

UITableViewCellas-のすべての側面に制約を追加したことを確認してください

ここに画像の説明を入力してください


実際、セルフシグテーブルテーブルビューセルを無効にすると、警告は消えました。
18

@turingtestedは、さまざまなデバイスでサポートを提供するために、セルフサイズのテーブルビューセルを有効にする必要があります。
ジャック

同意しますが、元の質問を読んでください。私が言ったことは、あなたの提案された解決策が、少なくとも私にとっては機能しなかったことです。
2018年

FYI UITableViewAutomaticDimensionは、UITableView.automaticDimension
atineoSEに

5

静的セルまたは動的セルを使用している場合、インスペクターテーブルのテーブルビューに行の高さを追加し、行の高さの右側にある自動をオフにすると、この警告が表示されなくなります。ここに画像の説明を入力してください


私は反対の方がより効果的であることがわかりました:明示的に推定された高さを設定し、行の高さ自体を自動にします。
NRitH

4

今日この警告を受けました。これは私のためにそれを消した原因です(インターフェースビルダーで)

1.テーブルビューの行の高さフィールドを44以外に設定します。2 tableViewセルの行の高さフィールドを44以外に設定します。

コードを変更する必要はありませんでした


3

私の場合、プログラムでセルを作成していて、このエラーが発生し続けました。

次のように、UITableViewCellinitメソッドにサブビューと制約を追加していました。

addSubview(rankingLabel)
addConstraints(cellConstraints)

contentView代わりにセルに追加することで問題を解決しました:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
直接contentViewではなく、常にサブビューをに追加してくださいUITableViewCell
dinesharjani

3

推定される行の高さをゼロに設定すると、警告が消えます。

ここに画像の説明を入力してください


実際の問題は、どこかに制約がないことです。おそらく、上部/下部の制約を設定する代わりに、何かを垂直方向に入力しています
TruMan1

1

私もXcode 6 GMへの移行中にこの警告を経験しました。デバイスを元の位置に戻したときにのみ警告が表示されました。

カスタムUITableViewCellsを使用しています。ストーリーボードテーブルビューは、カスタムサイズ(私の場合は100.0)に設定されています。テーブルセルは以前のリリースと同じように適切にレンダリングされますが、警告メッセージは好きではありませんでした。

上記のアイデアに加えて、私はこれを追加しました

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

画面が表示されます...回転に応答し、警告メッセージは表示されません。


だから私はあなたが私に与えた行を使ってあなたの方法を使ってみましたが、それでも私は同じエラーを思いつきます。また、アプリでローテーションを使用していません。
David E

1

xcode 6.0.1では、次を使用して行の高さを指定するこの警告を削除しました。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

tableViewのカスタムtableViewCellを作成した場合は、セルに下部制約と上部制約の両方を指定していることを確認してください。カスタムセル内のサブビューが中央のYに配置されていると、このメッセージが表示され、エラーメッセージは表示されませんが、混乱します。次に、私が添付した画像のように、テーブルビューの行の高さを特定します。ここでは、上部と下部の両方に制約があります

tableViewのカスタムセルを作成するときは、セル内のカスタムセルのサブビューに特定の行の高さまたは上部と下部の制約を設定する必要があります(たとえば、下の画像のようなカスタムセルのラベル)

しかし、これがうまくいかない場合は、この画像のように自動ではなく、セルの行の高さを設定してみてください

ただし、自動チェックをオフにした場合は、プログラムで変更するために行サイズを調整する必要があります。


0

ストーリーボードで設定cell Row heightと同じ値を持つフィールドをRow height中にtableView(私のために働いた、同じ値の両方)。

heightForRowAtIndexPathコードに関数を追加すると、セルごとに呼び出されるため、パフォーマンスの問題が発生する可能性があるので注意してください。


0

制約がすべてのアイテムを垂直方向に揃えるように設定されていて、セルに高さを指定していない場合は、このメッセージが表示されることもあります。アイテムに上/下の制約を設定すると、警告が消えます。


0

カスタムtableViewCellのラベルとビューが、コンテンツビューではなくcustomCellに制約されていると、この問題が発生しました。制約をクリアしてセルコンテンツビューに接続すると、問題は解決しました。


0

同じエラーメッセージが表示されました。テーブルビューやテーブルビュー制約のように、すべてのアウトレットが有効であることを確認してください


0

動的高さ計算を行う場合、

  • 上部や下部などの制約に関して、すべての要素を相互にリンクする必要があります。
  • あなたは間違いなくあなたのセルの下部にある要素にリンクされている下部の制約を持っている必要があります

0

動的な行の高さを持つカスタムテーブルビューセルにも同様の問題があります。動的な高さが反映されず、コンソールで同じ警告が表示されました。解決策は、contentViewの代わりにサブビューをセルに追加することです。ところで、私はサブビューをプログラムで作成しました。


0

TableViewCell初期化時に制約が設定されているsにこの問題がありますが、セルのコンテンツが後で読み込まれる場合、これは自動レイアウトエンジンが高さを決定できないことを意味します。セルの高さをにする必要があるため、ここでの他のソリューションは機能しませんUITableView.automaticDimension

セルに追加の制約を追加しました:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

今日、この警告が出ました。コードに1行追加しただけです。

tableView.rowHeight = 200;

このコード行を

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

そして最終的なコードは次のようになります

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

このコードは、テーブルの行セルの高さを200に増やします。デフォルトの高さは44です。


-1

私は同じエラーを抱えていますが、この行が原因で、このエラーが表示されました。

self.layer.backgroundColor = UIColor(white:1、alpha:0.2)as!CGColor

次のように行を変更してエラーを修正します

self.layer.backgroundColor = UIColor(white:1、alpha:0.2).cgColor

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.