使用自动布局将UITableView的高度设置为其内容的高度

时间:2015-10-21 20:18:19

标签: ios swift uitableview

我有一个View,里面有两个标签和一个Table View。我希望标签1始终位于我的表视图上方并标记为2,位于表格视图下方。问题是表格视图需要自动调整高度或增加的含义。

现在我有一个约束,说表视图的高度总是等于85,@IBOutlet到高度约束,我可以改变常量。

我猜我需要将常数更改为所有单元格的高度,但我不确定如何。

Menu constraints

7 个答案:

答案 0 :(得分:54)

您必须在UIViewController中覆盖updateViewConstraints()并将高度约束常量设置为tableView.contentSize.height:

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

然后,您必须确保Label2的最高约束为greaterThanOrEqual到表格视图的底部。而且,您还必须将表格视图的高度约束优先级从Required更改为High,以避免在表格视图contentHeight为{{1}}时存在冲突的约束大于可用的高度。

答案 1 :(得分:32)

还有另一种解决方案。 你可以在tableview'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()
    }

}

答案 2 :(得分:1)

以下代码对我有用。

  1. 为tableViewHeight创建出口。
Minimum
  1. 对于单元的动态高度,我使用了以下代码:
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!
var tableViewHeight: CGFloat = 0  // Dynamically calcualted height of TableView.
  1. 对于TableView的高度,以及TableView单元格的动态高度:
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return tableView.estimatedRowHeight
}

说明:

在创建TableView单元格之后,我们获取将要显示的单元格的框架高度,并将该单元格的高度添加到主TableView中。

答案 3 :(得分:0)

在Swift 4.2和Xcode 10.1中

这里有两个选项可以根据内容动态设置UITableView的高度。

1)如果您获得内容大小,请在viewDidLayoutSubviews()

中使用此代码
DispatchQueue.main.async {
  var frame = self.TblView.frame
  frame.size.height = self.TblView.contentSize.height
   self.TblView.frame = frame
}

2)基于表视图高度约束,更新表视图高度。在获得服务器的响应后,重新加载表视图时,请编写以下代码。

DispatchQueue.main.async {
    self.TblViewHeightConstraint.constant = CGFloat((self.array.count) * 30)//Here 30 is my cell height
     self.TblView.reloadData()
}

答案 4 :(得分:0)

要自动调整其内容大小的TableView Height高度,请在ViewController类中使用它

// constraintTableViewHeight:-tableview高度约束

override func viewWillLayoutSubviews() {

        super.updateViewConstraints()
        self.constraintTableViewHeight.constant = self.tableView.contentSize.height
    }

并添加

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        self.viewWillLayoutSubviews()
    }

此代码可轻松根据其内容大小自动调整表格视图的高度。

答案 5 :(得分:0)

将@nova答案扩展到Swift 4

tableViewSizeObservation = tableView.observe(\.contentSize) { [weak self] (tableView, _) in
   tableView.layer.removeAllAnimations()
   self?.tableViewHeightContraint.constant = tableView.contentSize.height
   UIView.animate(withDuration: 0.5) {
         self?.view.updateConstraints()
         self?.view.layoutIfNeeded()
   }
}

deinit {
    tableViewSizeObservation?.invalidate()
}

答案 6 :(得分:0)

一种更现代的方法是这样做:

override func updateViewConstraints() {
    tableView.heightAnchor.constraint(equalToConstant: tableView.contentSize.height).isActive = true
    super.updateViewConstraints()
}