web-dev-qa-db-ja.com

iOS8-高さゼロを明確に示唆する制約

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

警告は1回のみ:制約がTableviewセルのコンテンツビューの高さ0をあいまいに示唆するケースを検出しました。意図しない折りたたみを検討しており、代わりに標準の高さを使用しています。

行には、次のように設定された固定の高さがあります。

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

そして、すべてのconstraintsは幸せそうです...

100
Chris

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

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

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

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

127
FBronner

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

77
MonsieurDart

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

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

9
ltm

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

3
Juraj Antas

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

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

3
teho

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

行の高さを自動的に調整するための幸せなレイアウトは、上記に加えて、セルの下部にも制約を含めることを意味します。

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

3
Woodster

この警告が表示される場合、自動レイアウトを使用しており、セルに内部の制約がないためです。

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

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

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

垂直制約

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

水平方向の制約

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

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

2
amir

AutoLayoutを使用して、適切な高さを計算できます。 iOS 8での動的セルの高さに関する素晴らしい投稿を次に示します。 http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/

1
ricardopereira

沼地の標準的な修正の場合、制約なし、高さの推定なし、または問題の過剰なエンジニアリング。デフォルトのプロジェクトを作成し、TableViewを接続しましたが、View ControllerにHeightデリゲートを配置するのを忘れていました。単にこの警告を消すには、これが必要です。

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

テーブルのView Controller内。

1
latenitecoder

Swiftで高さを強制的に設定すると、問題が解決しました。

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
King-Wizard

Uitableviewcell内でmapViewを使用していました。マップビューの高さをデバイスの画面サイズの1/3に変更しました。同じエラーが発生しました。 uitableviewcellのコンテンツビューに欠落している制約を追加することにより、エラーを修正しました。

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

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

enter image description here

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

4)コンテンツビューに必要なすべての制約があることを確認します。 enter image description here

1
A.G

ここで起こっている2つの重要なことがあります。

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

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

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

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

0
Greg

このエラーと、必要な制約と競合する制約が作成されている(場所がわからない)別のエラーの間を何日も何度も行き来しました。すべての表示可能なプロパティが他のプロパティと同一である1つのインスタンスで動作することさえありました。私が見つけた唯一の解決策は、アトミックにすることでした-xibを使用して完全に新しいファイルを作成し、古いコードをコピーして貼り付けてコンセントを再接続し直します。それは最善の解決策ではないかもしれませんが、問題が目に見えない場合、他にやることがほとんどないことがあります。少なくとも、アトミックにすることは、何が起こっているのかを確認する良い方法です。

0
DrWhat

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

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

0
onmyway133

このページの回答では、高さの制約を追加すること、またはheightForRowAtIndexPathの44のようなrowHeightsを手動で返すことで警告が消えますが、これはXcode少なくともバージョン6.3.2(6D2105)で表示されます。

ViewDidLoadでブレークポイントを設定すると、ストーリーボードで行の高さを44に指定しても、self.tableView.rowHeight = -1(UITableViewAutomaticDimension)が表示されます。これは、Appleは、行の高さを44のままにした場合、動的な行の高さが必要だと誤って想定するためです。

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

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

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

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

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

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

私はこれに対する純粋なストーリーボードソリューションが本当に欲しかったので、ついに試しました:

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

enter image description here

enter image description here

これらのバグはすべてiOS開発ではあまりにも一般的であり、開発者がソリューションが長期的に保守性にどのように影響するかの影響を評価するために過度の時間を費やすことを余儀なくされます。

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

0
Zack Morris

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

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

0
David Nix