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

Dum*_*pen 35 uitableview ios swift

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

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

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

菜单限制

joe*_*ern 57

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

override func updateViewConstraints() {
    tableHeightConstraint.constant = tableView.contentSize.height
    super.updateViewConstraints()
}
Run Code Online (Sandbox Code Playgroud)

然后你必须确保它Label2有一个顶部约束greaterThanOrEqual到表视图的底部.而且,当表视图的大于可用高度时,您还必须更改表视图的高度约束的优先级Required,High以避免冲突的约束contentHeight.

  • 在viewDidLayoutSubviews中添加它,对我有用. (5认同)
  • @GMHSJ,在布局系统完成计算帧后会调用afaik viewDidLayoutSubviews,因此,如果您在此处更改约束,它将再次触发布局过程,最终将产生无限递归。 (2认同)

Ham*_*ova 41

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

}
Run Code Online (Sandbox Code Playgroud)

  • 有用。这不是一个优雅的方法。实际上很多年了,APPLE并没有实现一种通过事件didFinishLoad来实现“ tableview.contentSize”的时尚方式。但是到目前为止,这是一种更干净的方法,而无需创建特定的类或扩展来处理此类普通任务。 (3认同)