web-dev-qa-db-ja.com

UITableViewCellで `[UIView -systemLayoutSizeFittingSize:]`を呼び出すと常に失敗します

UITableViewCellsに自動レイアウトを使用したい。これらの表のセルには、動的な高さがあります(テキストの長さに依存します)。

[UIView -systemLayoutSizeFittingSize:] を使用して適切なセルの高さを計算しています([UITableView -heightForRowAtIndexPath:]で返す)が、次の結果が得られます。

  • UILayoutFittingCompressedSizeを渡した場合、CGSizeは(0,0)になります。

  • UILayoutFittingExpandedSizeを渡すと、次のエラーでアプリがクラッシュします。

    ***-[NSISLinearExpression incrementConstant:]、/ SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620のアサーションエラー

(私の推測では、これはある数が無限であることを意味します。)

私の実装は簡単です。各オブジェクトの高さを計算し、それをキャッシュします。

MessageCell *cell = // allocate a new cell...

//  set up the cell (assign text, images, etc)

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

self.cellHeight = size.height;  // size always equals (0, 0)

これは私が設定した制約の問題であると仮定しますが、

  • cellHeightを手動で大きな値に設定すると、高さが正しくないことを除いて、セルはすべて正常に見えます。
  • Interface Builderは、あいまいな制約について警告を表示しません
  • [cell hasAmbiguousLayout]NOを返します。
  • 特に私のセルには48x48に設定された画像があるため、(0、0)のサイズはすべての制約を満たす必要はありません。

何か案は?

20
Aaron Brager

これは私にとってうまくいくものです(「contentView」に注意してください)

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

編集:私は同様の質問に答え、ここに完全な例を提供しました:

autolayoutですべてのサブビューに合うようにスーパービューのサイズを変更する方法

38
TomSwift

あなたが使用する制約を投稿しなかったので、投稿に基づいて具体的なことを言うのは難しいです。 Appleドキュメント:

systemLayoutSizeFittingSize:

保持する制約を満たすビューのサイズを返します。

セルのサイズが(0,0)に等しいと解釈できる制約を作成した可能性があります。

テキストでセルの高さを確認できる別の方法があります。あなたはあなたのテキストをUITextViewに入れてから:

UITextView textView; 
textView.text = @"l";
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE];
//some code here
//
CGFloat cellHeight = textView.contentSize.height;

ContentSizeプロパティを使用する前に、UITextViewのテキストとフォント(およびUITextViewの高さを変更する可能性のあるその他すべてのプロパティ)を設定することが重要です。また、最初にUITextViewをビューに追加する必要があります。

////// EDIT

制約を使用するアプローチの問題は、ISNがビューに追加していないセルを測定して、システムに必要なすべての情報がないことです。セルの周囲の領域がわからないため、スペースなどのスペースがどれくらいかわからない

2