自适应大小的表格视图

10
首先,这不是关于如何自动调整tableview中单元格大小的问题,更准确地说是关于如何自动调整整个tableview大小的问题。
我有一个滚动视图,其子视图包括一个tableview和其他两个视图。tableview的单元格已经自动调整大小,但tableview本身却没有任何变化。
我所做的是: 1)设置tableview具有顶部、底部、前导和后续约束 2)设置单元格启用自动布局 3)*我不知道构建时单元格的大小 4)我在tableview上禁用了滚动模式
长话短说,我该如何让tableview自动调整大小?
编辑 单元格包含可以拥有各种文本行数的标签,因此使用自动布局的单元格应该决定tableview的高度。
以下图片显示了视图的设置:
如您所见,tableview只是视图的一小部分,并且由于从tableview卸载了滚动视图,因此不应该出现滚动问题。
编辑2 实际上,这就是它应该结束的方式,但是我正在自己计算这一点,每次我想对单元格进行小的更改时,整个计算单元格高度的代码都需要重写,而我很难得到正确的高度。
编辑3 迄今为止,我在tableview上有一个高度约束,我手动计算它,但是删除此约束并尝试让自动布局处理tableview的高度大小会创建以下错误:
滚动视图需要Y位置或高度的约束。
因此可以得出结论:tableview不知道如何根据具有自动布局的单元格自动计算高度。

基于单元格高度动态调整表视图的大小是不寻常的...也许你能更好地描述一下你的最终目标是什么?您说“tableview和其他2个视图”...您是否最好将“其他视图”用作表格的页眉和页脚视图?然后您根本不需要额外的滚动视图。 - DonMag
或许你根本不应该使用表视图。我猜你不会期望一个超过500行的表格吧?有其他方法可以展示重复的可变高度视图,这可能比使用表视图单元更好(更容易)。 - DonMag
那么...你不想使用表格视图有什么原因吗? - DonMag
但是表视图(和集合视图)基本上是为您正在进行的操作而设计的。 您可以设计尽可能多不同类型的单元格,以处理所有不同类型的要显示的信息...它们都可以自动调整大小...并且表/集合视图会为您处理所有滚动。 除非您没有提到一些关键细节,否则听起来您正在过度复杂化事情。 - DonMag
那么你基本上是在说我应该创建一个表格视图,其中第一个单元格应该是图像库,最后一个单元格应该是描述吗?我以过度复杂化问题而著称,所以这很有可能。 - J.Paravicini
显示剩余7条评论
2个回答

14

您无需创建高度约束或设置框架。创建UITableView的子类,并在每次其contentSize更改(即添加或删除新数据)时重新计算其intrinsicContentSize。以下是您需要的全部内容:

class SelfSizingTableView: UITableView {
    override var contentSize: CGSize {
        didSet {
            invalidateIntrinsicContentSize()
            setNeedsLayout()
        }
    }

    override var intrinsicContentSize: CGSize {
        let height = min(.infinity, contentSize.height)
        return CGSize(width: contentSize.width, height: height)
    }
}

1
为什么要设置 height = min(.infinity, contentSize.height)?当 contentSize.height 总是小于或等于 .infinity 吗?还是说呢? - eja08
@eja08 很好的发现。.infinity 可以被替换为一个 maxHeight 变量,这样 tbv 就会在达到一定点后停止增长。我只是这里没有包含它。 - Linh Ta

-2

您可以使用tableview.frame = CGRect(x: <some_x>, y: <some_y>, width: <some_width>, height: <some_height>)来更改您的UITableView框架。

如果您的UITableViewCells使用自动布局,则它们应该在UITableView框架更改时调整大小。


这个想法是单元格决定表视图的高度,而不是相反。 - J.Paravicini
你能提供一个使用图像或另一个应用程序的例子来说明这个技术吗?为什么要让单元格调整表视图的大小?这并不真正符合任何正常的设计模式,基于我对你的问题的理解,我会重新考虑这种方法。 - Eli Whittle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接