iOS8-制約があいまいに高さゼロを示唆しています


100

誰もこれをデバッグする方法を知っていますか?

1回のみ警告:制約により、テーブルビューセルのコンテンツビューの高さがゼロであることを曖昧に示唆するケースが検出されました。意図しない折りたたみを考慮し、代わりに標準の高さを使用しています。

行の高さは、次のように設定されています。

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

そして、すべてconstraintsが幸せそうに見えます...

回答:


129

私の場合、戻り高さと推定高さを強制すると警告が消えました。

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

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

2つのオーバーライドを必要としない別の解決策は、単にself.tableView.rowHeight = 44;loadViewまたはinitメソッドで使用することです。


1
セクションに複数のタイプの行があり、そのうちの1つだけが動的な高さを持っています。その後、機能していません
Raj Aggrawal

xib / storyboardでデフォルトの高さを設定する場合、これらのメソッドを実装する必要はありません。
サティヤム

77

また、コンテンツビューの上部から下部に垂直方向の制約を追加することもできます。これで自動レイアウトが楽しくなります(セルの高さを自分で計算する方法を知っているため)。


2
これでうまくいきました。すべてのコンテナセルを調べ、少なくとも1つのサブビューに「コンテナへの上部スペース」制約と「コンテナへの下部スペース」制約の両方があることを確認しました。
Rog182 2014年

7
これは、セルフサイズのテーブルビューセルを使用する場合のiOS 8の正解です。
tsafrir 2015年

1
コンテンツビュー内の要素からコンテンツビューの上部と下部への制約を意味しますか?
ザックシャピロ

私はこれを試しましたが、矛盾する制約の警告が出続けます。
Shirish Kumar

2
セル自体ではなく、セルのコンテンツビューに上部と下部の制約を追加していることを確認してください。あなたがセルに制約を追加した場合、コードはまだ仕事が、0の高さを使用しようとします
frin

26

autoLayout制約とUITableViewAutomaticDimensionを使用している場合、このエラーは、コードで高さをオーバーライドすることによって破棄される誤った問題ではありません。これは、必要な適切な垂直方向の制約がないため、セルの高さを自動的に決定することが機能しないことを意味します。

私と同じようにこのエラーが発生し、どのセルがエラーをスローしているかを特定するのに助けが必要な場合は、 'heightforRowAtIndexPath'メソッドが返される直前に次の行を追加できます。

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);

これにより、セクションと行の長いリストが出力されますが、エラーの原因となっている特定のセルの直後にエラーが表示され、問題の原因となっているセルをすばやく特定して、それに応じて制約を修正できます。これは、静的セルに特に役立ちます。autoLayoutと自動セルの高さを使用していない場合は、手動で入力した数値で高さをオーバーライドできますが、基本的にこれらの機能を無効にします。

以前 'heightForRowAtIndexPath'メソッドを使用していなかったが、UITableViewAutomaticDimension設定を元に戻さずにこのエラーをデバッグしたい場合は、これをコードに追加してください:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}

本当にありがとうございます。これは私を大いに助けました。最初は、その問題は別のテーブルビューセルにあると思いました。デバッグした後、その問題は別の問題でした。
akozin

これを実行したいのですが、長いセクションと行は不明です。これらがSwiftでどうあるべきかを明確にできますか?
DrWhat

9

自動レイアウトを使用し、各テーブルビューセルの行の高さの値を指定せず、代わりに「デフォルト」の値のままにすると、この問題の原因となるXCode 6.1にバグがあるようです。すべてのセルについて、行の高さの横にある「カスタム」チェックボックスをオンにするだけで、警告が表示されなくなります。


2
セルサイズのセルを使用している場合は、行の高さを「デフォルト」に設定したままにする必要があります。
ファットマン2014年

1
これで警告は解決しました。しかし、それはTableViewで静的セルを使用する場合にのみ表示されると思います
MontiRabbit

1
@phatmannこの問題は静的なセルでのみ発生するため、セルのサイズが自己調整されることはありません。
ltm

ユーザーがテキストを拡大している場合、静的セルでは@ltmセルの自己サイズ設定は役に立たない可能性がありますか?(ご存知のとおり、iPhone設定のアクセシビリティの下で)
Byron Coetsee

私はそれはバグではないと思います、それは垂直方向の制約の問題かもしれません、彼らはセルの高さを完全に記述しなければなりません、少なくとも自動寸法のテーブルビューのために。
juanjo 2015年

3

はい、テーブルビューセルのアイテムに水平方向の制約しかない場合でも、すべての制約が「満足」します。同じ問題がありました。垂直方向の制約も追加する必要があります。そうすることで、その警告は消えます。


3

制約は、レイアウトの目的には適していますが、行の自動高さの目的には適していません。幸せなレイアウトは、コンテンツが曖昧さなくレイアウトできることを意味します。これは、Interface Builderのチェックを満たすでしょう。

自動行の高さのレイアウトが適切であれば、上記に加えて、セルの下部への制約も含めることになります。

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


3

テーブルビューのサイズインスペクターで行の高さ43(または<> 44)を使用したところ、エラーが消えました。44を使用すると、エラーが発生します。Xcodeバージョン6.0.1

-この回答はモデレーターによって削除されました。削除しないでください。問題が修正されます。これは私のために問題を解決し、他の人にもそれをするかもしれません。二度と削除しないでください。


2

警告を削除できませんでしたが、制約を機能させるために、newをiOS8に設定し、tableviewプロパティestimatedRowHeightを固定の高さに設定して、heightForRowAtIndexPath実装を削除しました。


警告が削除されなかった場合は、不足している制約を補い、行の高さ==をcell.rowHeightプロパティに設定しているシステムです。警告は自動修復プロパティに関するものです。自動修復された場合、問題はなかったのですか?
ペドロボルヘス

2

この警告が表示された場合は、自動レイアウトを使用していて、セル内に制約がないためと考えられます。

自動レイアウトの使用を停止するか、セルの高さを明確に定義する制約を実装する必要があります。

右側のファイルインスペクタで[Autolayoutを使用]オプションをオフにすると、インターフェースビルダーで自動レイアウトをオフにできます。

自動レイアウトを使用することを選択し、セルの高さが固定されている場合、適切な制約の実装は簡単です。セルのコンテンツビューのサブビューに高さの制約を追加し、サブビュー間、およびサブビューとコンテンツビューの間に垂直方向のスペース制約を実装するだけです。たとえば、セルにラベルが1つある場合、これは機能します。

垂直方向の制約

  1. コンテンツビューの上部とラベルの上部の間の垂直方向のスペース制約
  2. ラベルの高さ制限を修正
  3. ラベルの下部とコンテンツビューの下部の間の垂直方向のスペース制約

水平拘束

  1. コンテンツビューのリーディングエッジとラベルのリーディングエッジの間の水平方向のスペース制約
  2. ラベルの固定幅制約
  3. ラベルの後端とコンテンツビューの後端の間の水平方向のスペース制約

私は制約を使用していますが、質問で述べたように、それらはすべて満足しているようです。
Chris

セルのコンテンツビューのサブビューにこれらの制約はありますか?彼らはどんな見た目ですか?異なるいくつかのセルがある可能性はありますか?フレデリックボナーのソリューションを使用して、セルの高さが固定されるように定義している場合、制約は上書きされます。
wrightak 2014年


1

スウィフトリターンの高さを強制的に私の問題を修正:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(indexPath.row == 0){
       return CGFloat(131.0)
    }else if(indexPath.row == 8){
       return CGFloat(97.0)
    }else{
       return CGFloat(44.0)
    }
}

1

沼地の標準修正の場合、制約なし、高さの見積もりなし、または問題の過剰設計。デフォルトのプロジェクトを作成し、テーブルビューを接続しましたが、ビューコントローラーに高さの代理オブジェクトを配置するのを忘れていました。この警告を単に消すには、これが必要です。

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

テーブルのビューコントローラー。


1

私はuitableviewcell内でmapViewを使用していました。マップビューの高さをデバイスの画面サイズの3分の1に変更しました。同じエラーが発生しました。uitableviewcellのコンテンツビューに不足している制約を追加してエラーを修正しました。

1)contentView制約をクリアします。

2)推奨定数にリセットをcontentViewに設定します。

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

3)不足している制約を追加します-存在する場合

4)コンテンツビューに必要なすべての制約があることを確認します。 ここに画像の説明を入力してください


0

私の場合は、xibを使用してセルを設計しているので、そのxibファイルをターゲットに追加するのを忘れています。

そのxibファイルをターゲットに追加した後、問題はなくなりました


0

高さの制約を追加するか、heightForRowAtIndexPathで44のようなrowHeightsを手動で返すことを論じているこのページの答えは警告を消しますが、これはXcodeのバグであるため不必要です。少なくともバージョン6.3.2(6D2105)で表示さです。

viewDidLoadにブレークポイントを設定すると、ストーリーボードで行の高さを44に指定した場合でも、self.tableView.rowHeight = -1(UITableViewAutomaticDimension)が表示されます。これは、行の高さを44のままにしておくと、Appleが動的な行の高さを求めると誤って想定するためです。これは、ユーザーが設定を指定するためのフラグを提供しなかったためです。

考えられる解決策とその結果は次のとおりです。

  • ストーリーボード(作品)で行の高さを43または45に設定します。

  • heightForRowAtIndexPathで高さ44を手動で返します(機能します)。

  • UITableViewCellの要素とそのcontentView(機能)の間に高さの制約を追加します。

残念ながら、これらのソリューションでは、設計を変更するか、不要な制約を追加するか、バグを回避するために不要なコードを追加する必要があります。私は(私が思っていたもの)最も簡単な解決策を試しました:

  • ストーリーボードで各UITableViewCellの高さを44(カスタム)に設定します(失敗)。

私は本当にこれに対する純粋なストーリーボードソリューションを望んでいたので、最終的に私は試しました:

  • ユーザー定義のランタイム属性をストーリーボードのUITableViewに追加し、将来の開発者が見つけられるように、そのrowHeightの設定方法に関するメモをUITableViewに付けます:(機能):

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

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

これらのバグはすべてiOS開発では一般的すぎるため、開発者はソリューションが長期的にメンテナンス性にどのように影響するかという影響を検討するために過度の時間を費やす必要があります。

保守可能で難読化されていないように見える概念的に正しいソリューションを見つけることは非常に難しいため、Appleがバグを修正し、44が近い将来のデフォルトの行の高さになるとすると、制約またはユーザー定義ランタイム属性ソリューションは、おそらく最も保守しやすいものです。


0

ここでは、2つの重要なことが起こっていると思います。

1)Ctrlキーを押しながらドラッグしている場合、制約を誤って設定するのは非常に簡単です。したがって、正しく実行されていることを再確認してください。これらの制約を描画するには、画面の左側にあるトレイを使用するのが最適です。

2)ViewDidLoadまたは他の場所で見積もった行の高さを指定する代わりに、デリゲートメソッドを使用します。

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

これで問題はすぐに解決しました。


なぜオーバーライドを使用しているのですか?
FractalDoctor 2015

0

ユニバーサルストーリーボードまたはxibsを使用しているときにもこのエラーが発生しました。Any x Anyサイズのクラスに適切な制約を指定しないと、このエラーが表示されます。

AppleはこれをiOS9で修正したようです。エラーは8.4でのみ発生しました。


0

このエラーと、制約が作成されていて(どこにあるかわからない)別のエラーが発生するまで、私は何日も何度も何度も何度も何度も行きましたが、これは私が望む制約と矛盾していました。私は、すべての表示可能なプロパティが他のプロパティと同一である1つのインスタンスでそれを機能させていました。私が見つけた唯一の解決策はアトミックにすることでした-xibで完全に新しいファイルを作成し、古いコードをコピーして貼り付けてアウトレットの再接続を再開します。これは最善の解決策ではないかもしれませんが、問題が見えない場合は、他にできることはほとんどありません。少なくとも、アトミックにすることは何が起こっているのかを検討するための良い方法です。

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