2017-07-07 20 views
1

これはかなりの間私を悩ませている問題です。TableViewサイズ変更親ビューiOS

X個のアイテムを持つtableViewを保持するビューを想定します。目的は、そのビューをtableViewの内容と同じくらい高くなるようにサイズ変更することです。 (5行がある場合例えば、それぞれがそのわずか乗算物質、50単位高い)

アプローチは、合計のtableViewの内容を計算します。その後、0 0 0 0で制約されたtableViewをビューに設定し、ビューの高さを250に設定します。

これは、固定高さのセルサイズでうまくいきます。しかしながら!

a)の問題はサイズ変更が自動的に行われるとtableHeightForRowがUITableViewAutomaticDimensionに設定されているシナリオでは、複雑な制約に関わらず、動的高細胞のために近づいたことだろうか?

b)アイデアはtableView.contentSizeを使用している可能性があります。しかし、親ビューフレームをそれに応じて設定するには、その値をいつ安全に取得するのでしょうか?それも可能ですか?

おかげでみんな

+0

ええええええええええええええええええええええ、セルが増えた時に内容をスクロールできないのですか? 1000個のセルが追加されたら、スクロールを有効にする必要がありますか? –

+0

1000アイテムの場合。しかし、何回か出てくることが分かっていない6項目のミックスとマッチの場合があります。私の場合は、メール、電話、タイトル、営業時間、営業日などの地図ピンの上に表示されるカスタムビューを作成しています。このすべての情報が常に利用可能なわけではありません –

+0

これらの6つのアイテムは週に7に変わり、多分3番目のアイテムは1か月で仕様から削除されます。テーブル(私は、間違っている場合は私を修正すると仮定)は、このような可変ビューを処理する方が簡単です。もう1つの方法は、1つの静的ビューをもう一方のビューに置き、相対的にそれらを制約することですが、これはテーブルよりも保守が容易ではありません。右? –

答えて

1

あなたはUITableViewサブクラスを持っている場合、あなたはこのようなcontentSizeのプロパティオブザーバを設定することができます。

override var contentSize: CGSize { 
     didSet { 
      // make delegate call or use some other mechanism to communicate size change to parent 
     } 
    } 

私の意見では、この最も簡単な方法は、自動レイアウトを使用することです。このアプローチをとると、intrinsicContentSizeを自動的に無効にすることができます。intrinsicContentSizeは、要素のサイズを動的に変更するためにautolayoutが使用する要素です(優先度の高い配置制約がそのサイズを制限しているか、明示的にサイズを設定していない場合)。

このような何か:

override var contentSize: CGSize { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    } 

override var intrinsicContentSize: CGSize { 
     return contentSize 
    } 

その後、ちょうどあなたの有効な配置制約を持つ親ビュー階層と必要の内容ハグ/圧縮抵抗にあなたのテーブルビューを追加します。

関連する問題