如何使用UIKit在Swift 5中创建具有内部高度的UITableView



我在使用UITableViews时遇到了一个问题。

AutoLayout需要UITableView的固定高度约束,因此添加或删除TableViewCells时,高度不会更改

我的问题是,我在ScrollView内部使用TableView。这并不是很好,因为这两个元素都是可滚动的

我的计划是始终根据其内容高度调整TableView的大小。在这种情况下,TableView可以永远不会滚动

到目前为止,我的想法如下,但由于某些原因,它并没有真正起作用:

tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)

如果您对如何解决此问题有任何想法,请在下面发表评论首选没有类扩展等的更简单的解决方案;(

谢谢大家!

您可以使用以下内容:

final class AutoSizingTableView: UITableView {
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
setContentCompressionResistancePriority(.required, for: .vertical)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setContentCompressionResistancePriority(.required, for: .vertical)
}
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
}
override var intrinsicContentSize: CGSize {
setNeedsLayout()
layoutIfNeeded()
return contentSize
}
}

基本上,这是在重新加载表视图的数据时,或者如果contentSize发生变化,将intrinsicContentSize设置为等于contentSize。

然而,你必须问自己一个问题:如果我不需要排队逻辑,我真的需要表视图吗?

您需要覆盖UIViewController中的updateViewConstraints()方法,并按如下方式设置tableView的新高度:

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

当您需要用新高度重新创建tableView时,请调用self.view.setNeedsUpdateConstraints()

最新更新