自定尺寸表视图

Posted

技术标签:

【中文标题】自定尺寸表视图【英文标题】:Self sizing tableview 【发布时间】:2017-06-04 21:56:56 【问题描述】:

首先这不是关于如何自动调整tableview 内的单元格大小的问题,更重要的是如何自动调整整个tableview 的大小。

所以我有一个滚动视图,它有一个表格视图和 2 个其他视图作为其子视图。表格视图的单元格已经自动调整大小,同样,这个问题与单个单元格无关。但是,tableview 根本不会调整大小。

我做了什么: 1)设置tableview有一个顶部,底部,前导和尾随约束 2) 将单元格设置为启用自动布局 3) * 我不知道构建时的单元格大小 4) 我在 tableview 上禁用了滚动模式

长话短说,我怎样才能让 tableview 自行调整大小?

编辑

单元格包含一个标签,该标签可以包含多行文本,因此使用自动布局的单元格应该确定表格视图的高度。

以下图片显示了视图的设置方式:

如您所见,tableview 只是视图的一小部分,并且由于 tableview 中的滚动视图已停用,因此应该也不会出现任何滚动问题。

编辑 2

这实际上是它应该如何结束但是,我自己计算这个,每次我想对单元格做一个小的改变时,计算单元格高度的整个代码都需要重写,它是我很难把高度调到合适的位置。

编辑 3

到目前为止,我对 tableview 有一个手动计算的高度约束,但是删除此约束并尝试让自动布局处理 tableview 高度大小会产生以下错误:

滚动视图 需要约束:Y 位置或高度

因此我可以得出结论,tableview 不知道如何使用自动布局根据其单元格自动计算高度。

【问题讨论】:

UITableView inside UIScrollView 是一种反模式,因为它破坏了单元格的重用,但如果您真的想这样做,请添加高度约束并将其设置为 tableView.contentSize.height 以编程方式并在每个数据之后更新。无法从单元格中确定高度。 根据 cell 高度动态调整表格视图的大小是不寻常的......也许如果你能更好地描述你的最终目标是什么?你说 "tableview 和 2 个其他视图" ... 使用“其他视图”作为表上的页眉和页脚视图可能会更好吗?那么你根本不需要额外的滚动视图。 或者...也许您根本不应该使用表格视图。我猜你不希望有一个 500 多行的表?还有其他方法可以显示重复的可变高度视图,这可能比使用表格视图单元格更好(更容易)。 那么...有什么理由你不想只使用表格视图吗? 好吧,我可以在没有表格视图的情况下做到这一点,但这样做会非常困难和痛苦。如果可以用表格视图来做,我想这样做,否则我会在没有的情况下做 【参考方案1】:

您无需创建高度限制或设置框架。创建 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)
    

【讨论】:

为什么要设置height = min(.infinity, contentSize.height)?当contentSize.height 总是小于或等于.infinity 时?还是这样? @eja08 不错的收获。 .infinity 可以替换为 maxHeight 变量,以便 tbv 在某个点后停止增长。我只是没有在这里包含它。【参考方案2】:

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

如果您的UITableViewCells 使用自动布局,那么它们应该在UITableView's 框架发生变化时调整大小。

【讨论】:

这个想法是单元格决定了tableviews的高度,而不是相反。 您能否提供一个使用图像或使用此技术的其他应用程序的示例?为什么要让单元格调整表格视图的大小?这并不真正符合任何正常的设计模式,我会根据我对您问题的理解重新考虑这种方法。

以上是关于自定尺寸表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何设置自定尺寸单元 iOS8

3.复杂查询

UIImage 中的自定尺寸 UITableViewCell 拉伸

自定尺寸单元格高度变化导致跳跃动画

如何在尺寸类更改期间从自定义演示控制器过渡到模态?

在超集中构建自定义马条形图并添加自定义项以自定义图表