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

问题描述 投票:0回答:2

使用UITableViews时遇到问题。

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

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

我的计划是总是调整TableView的大小与其内容高度有关。在这种情况下,TableView可以从不滚动

到目前为止,我的想法如下,但由于某种原因,它实际上没有用:

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

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

非常感谢你们!

swift xcode uitableview autolayout uikit
2个回答
0
投票

您可以使用以下方式:

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发生更改时,将internalContentSize设置为与contentSize相等。

但是您必须问自己一个问题:如果我不需要出队逻辑,我实际上需要一个表视图吗?


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.