2015-10-21 35 views
21

私は2つのラベルとその中のテーブルビューを持つビューを持っています。ラベル1は常にテーブルビューの上に、ラベル2はテーブルビューの下になるようにします。問題は、テーブルビューが高さの増加または減少のいずれかを意味する自動サイズ調整が必要であることです。自動レイアウトでUITableViewの高さをコンテンツの高さに設定します

今私はテーブルビューの高さが常に85に等しく、高さ制約に@IBOutletという定数を変更できるという制約があります。

私はすべてのセルの高さに定数を変更する必要があると思っていますが、わかりません。

Menu constraints

+1

別の解決策は、独自の 'intrinsicContentSize.height'を' contentSize.height'に設定する 'UITableView'のサブクラスを作ることです。 http://stackoverflow.com/a/17335818/77567を参照してください。 –

+0

@robmayoffの回答は、私の意見では、joernの回答よりもダイナミックなので、より良いです。 – Altimac

答えて

40

はあなたのUIViewControllerでupdateViewConstraints()をオーバーライドして、高さ制約の定数tableView.contentSize.heightに設定する必要があります。

override func updateViewConstraints() { 
    super.updateViewConstraints() 
    tableHeightConstraint.constant = tableView.contentSize.height 
} 

を次にあなたがLabel2トップ制約を持っていることを確認する必要があり、そのテーブルビューの下部にはgreaterThanOrEqualです。また、テーブルビューのcontentHeightが使用可能な高さより大きい場合に、競合する制約を避けるために、テーブルビューの高さ制約の優先度をRequiredからHighに変更する必要があります。

+0

完璧、ありがとう。 – Dumpen

+0

ありがとうございました、私の時間を保存しました:) – MRustamzade

+0

これをviewDidLayoutSubviewsに追加すると、私のために働きました。 – GMHSJ

13

別の解決策があります。 テーブルビュー 'contentSize'変数にオブザーバを追加できます。テーブルビューの内容が変更されたときのセルフサイズ。

@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.new, context: nil) 
} 
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    tableView.layer.removeAllAnimations() 
    tableHeightConstraint.constant = tableView.contentSize.height 
    UIView.animate(withDuration: 0.5) { 
     self.updateConstraints() 
     self.layoutIfNeeded() 
    } 

} 
+0

これは素晴らしい答えです。 –

+0

これは完璧です。ベストアンサー。 – EmilioK

+0

あなたは大歓迎です:) – nova

関連する問題