如何根据里面的单元格自动设置 UITableView 的高度?

Posted

技术标签:

【中文标题】如何根据里面的单元格自动设置 UITableView 的高度?【英文标题】:How to automatically set height of UITableView based on cells that are inside of it? 【发布时间】:2021-06-18 22:36:01 【问题描述】:

我在屏幕中间有一个 UITableView,我想根据其中的单元格数量调整 tableview 的高度,其中数据是从 API 获取的。也就是说,把tableview的高度设为x * height of each cell

我环顾四周,发现您可以根据其中的内容自动调整单元格高度,但这不是我想要的(它们都将是相同的大小)。

有什么办法吗?

【问题讨论】:

【参考方案1】:

您只想使用UITableView吗? 您可以使用UIStackView 来实现它。如果您需要添加滚动行为 - 这也是可能的,谷歌堆栈视图 + 滚动。

下面是一个动态高度表视图自定义类。

class DynamicHeightTableView: UITableView 

    // By default UITableView doesn't have `intrinsicContentSize`
    // Overriden in order to make it work with autolayout system
    override var intrinsicContentSize: CGSize 
        layoutIfNeeded()

        return contentSize
    

    override var contentSize: CGSize 
        didSet 
            invalidateIntrinsicContentSize()
        
    

    override func reloadData() 
        super.reloadData()

        invalidateIntrinsicContentSize()
    

【讨论】:

【参考方案2】:

尝试以下:

    像这样在 UIViewController 子类中声明一个变量。
private var contentSizeObservation: NSKeyValueObservation?
    viewDidLoad() 内部或无论何时设置myTableView,开始观察 contentSize 的变化。
contentSizeObservation = myTableView.observe(\.contentSize, options: .new, changeHandler:  [weak self] (tv, _) in
    guard let self = self else  return 
    self.myTableViewHeightConstraint.constant = tv.contentSize.height
)
    不要忘记在deinit 电话中清理它 -
deinit 
    contentSizeObservation?.invalidate()

这种方法将确保您的 myTableView 的高度始终与其内容一样大。

【讨论】:

以上是关于如何根据里面的单元格自动设置 UITableView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

excel如何根据条件自动变换行列颜色?

如何根据里面的 UILabel 子视图调整 UICollectionView 中的单元格大小

如何根据多个单元格中的值自动填充

如何根据动态高度单元格设置 UITableView 的高度约束?

如何根据公式自动选择 OpenOffice Calc 单元格?

如何在 UITableView 样式分组中设置单元格的角半径?