web-dev-qa-db-ja.com

制約があいまいにゼロの高さを示唆する場合を検出しました

Tableviewセルを含むアプリを実行するときに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を使用すると、いくつかのエラーが発生しましたが、アップグレードしてからエラーはなくなりました。現在、他のエラーや警告はありません。私はすでにすべてのTableViewセルのサイズを調整しようとし、標準の高さを使用しようとしましたが、まだ同じ警告が表示されます:

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セルにあるはずの写真が存在しないことを除いて、アプリは正常に動作します。

104
David E

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

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

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

  • TableviewのデリゲートメソッドheightForRowAtIndexPathを実装するには

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

奇妙な。

111
Viktor Kucera

IOS8のTableviewsの素晴らしい新機能である自動行の高さの副作用に遭遇しています。

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

IOS 8では、上記の操作を引き続き実行できますが、自動レイアウトを使用してセルのコンテンツを構成した場合、行の高さをiOSで決定できるようになりました。これは、動的フォントサイズが変更されたり、ユーザーがアクセシビリティ設定を使用してテキストサイズを変更したりすると、UIが新しいサイズに適応できるため、開発者にとって大きな利点です。また、複数行のテキストを含むことができるUILabelがある場合、セルは必要に応じて拡大し、不要な場合は縮小できるため、不要な空白はありません。

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

動的なセルの高さを使用するには、他のポスターで既に述べた手法とともに、このメッセージも削除します。UIアイテムを上部にバインドするのに十分な制約をセルに設定する必要がありますおよび下部セルの。以前に自動レイアウトを使用したことがある場合は、おそらく上+先行の制約を設定することに慣れていますが、動的な行の高さには下の制約も必要です。

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

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

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

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

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

198
Woodster

カスタムUITableViewCellを作成し、contentViewの代わりにサブビューをセルに追加すると、この問題が発生しました。

9
ABakerSmith

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

enter image description here

9
Anconia

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

5
Alok

今日、この警告を受けました。私にとってそれが消えた理由は次のとおりです(インターフェースビルダーで)

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

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

4
humblePilgrim

セルフサイジングテーブルビューセルを有効にするだけです

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

enter image description here

3
Jack

Uが静的セルまたは動的セルを使用している場合、単にインスペクターテーブルのテーブルビューに行の高さを追加し、行の高さの右側の自動をオフにすると、この警告が表示されなくなります. enter image description here

3
Amit Verma

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

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

addSubview(rankingLabel)
addConstraints(cellConstraints)

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

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

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

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

私もこの警告をXcode 6 GMに移行する際に経験しました。デバイスを回転させて元の位置に戻したときにのみ警告が表示されました。

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

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

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

画面のレンダリング...回転に応答し、警告メッセージは表示されません。

1
DannyJi

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

enter image description here

1
TruMan1

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

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

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

ただし、その自動ティックをオフにする場合は、自動的に行われた可能性のある変更を行サイズに合わせてプログラムで調整する必要があります。

1
monster pit

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

0
Micah Montoya

ストーリーボードで、cellRow heightと同じ値を持つtableViewRow heightフィールドを設定します(どちらも同じ値で機能します)。

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

0

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

0
Marija Zivkovic

このエラーが表示されたこの行のため、同じエラーがあります。

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

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

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

0
Malik Hassnain

同じエラーメッセージが表示されました。TableViewおよびTableview Constraintsのように、すべてのアウトレットが有効であることを確認してください

0
Gulz