我有一个View,里面有两个标签和一个Table View。我希望标签1始终位于我的表视图上方并标记为2,位于表格视图下方。问题是表格视图需要自动调整高度或增加的含义。
现在我有一个约束,说表视图的高度总是等于85,@IBOutlet
到高度约束,我可以改变常量。
我猜我需要将常数更改为所有单元格的高度,但我不确定如何。
答案 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)
以下代码对我有用。
- 为tableViewHeight创建出口。
Minimum
- 对于单元的动态高度,我使用了以下代码:
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!
var tableViewHeight: CGFloat = 0 // Dynamically calcualted height of TableView.
- 对于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()
}