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

How to create an UITableView with an intrinsic Height in Swift 5 using UIKit?

我 运行 在使用 UITableViews 时遇到问题。

AutoLayout requires a fixed Height Constraint for the UITableView, so the Height does not change when I add or remove TableViewCells.

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

My Plan is to always resize the TableView in relation to its content Height. In this case the TableView can never get scrolled.

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

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

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

非常感谢你们!

您可以按照以下方式使用:

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
    }
}

基本上,当重新加载 tableview 的数据或 contentSize 发生变化时,将 intrinsicContentSize 设置为等于 contentSize。

但是你必须问自己这个问题:如果我不需要出队逻辑,我真的需要一个表视图吗?

您需要重写 UIViewController 中的 updateViewConstraints() 方法并设置 tableView 的新高度,如下所示:

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

并在您需要使用新高度重新创建 tableView 时调用 self.view.setNeedsUpdateConstraints()