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

chr*_*epe 2 xcode uitableview uikit autolayout swift

我在使用时遇到了问题UITableViews

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

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

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

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

tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)
Run Code Online (Sandbox Code Playgroud)

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

非常感谢大家!

San*_*ans 7

您可以使用以下内容:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,它的作用是在重新加载 tableview 的数据或 contentSize 更改时设置一个等于 contentSize 的内在ContentSize。

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