在单元格内显示整个表格视图
Posted
技术标签:
【中文标题】在单元格内显示整个表格视图【英文标题】:Show entire table view inside cell 【发布时间】:2018-02-09 21:43:59 【问题描述】:我需要在(静态表格的)单元格内显示动态表格视图。使用部分代替对我来说是不够的。但是我不希望这个表是可滚动的,所以整个表必须同时出现。问题是这个表大小[和行数,以及每行大小] 根据显示的内容而变化。如何将单元格(包含表格)的自动调整大小属性与必须同时显示所有内容的表格相关联?
目前我在单元格内有 tableView,并且约束将它绑定到所有 4 个边。第一个表(不是单元格内的表)rowHeight 属性设置为 UITableViewAutomaticDimension,但单元格内的表并未完全显示。 如果我将静态单元格高度设置为大于 tableView(单元格内)高度的值,则会显示整个表格,并且在其下方还有一个额外的空间(因为表格被限制在单元格的 4 个边上)
那么,关于如何在一个动态具有完美尺寸的单元格中显示整个表格的任何想法?
ps:我尝试在单元格内使用集合视图。不幸的是,它不符合我的目的。
谢谢!
更新
我尝试为内部表创建一个类并使用(如iamirzhan 所指)contentSize didSet,如下所示:
override var contentSize:CGSize
didSet
self.invalidateIntrinsicContentSize()
然后我使用这个方法调用了一个函数来调整包含表格的单元格的大小:self.frame.size.height = table.contentSize.height
。该函数在此单元格自己的类上。
这行得通,表格现在完全出现了。问题是它与下面的单元格重叠,所以我仍在寻找解决方案。
【问题讨论】:
你能以某种方式提供你想要实现的设计吗?也许 tableView 里面的 TableView 是矫枉过正... 内表单元格的高度是静态的??? 内部表格单元格的高度也可能不同 Dominik Bucher,我正在尝试实现一个包含 6 个静态单元格的表格视图,每个单元格都有不同的内容(图片博客文章:文本,而不是图像,比更多文本,而不是列表的项目等)。我在我的问题中提到的内表将等同于项目列表。 (它不是一个博客应用,但这个例子很合适) 【参考方案1】:我不明白为什么这需要 2 个表格视图。静态部分应该是 uitableviewheaderfooters 或者只是一个 UIStackView。但要回答您的问题,只需查询您的子 tableView 的大小,然后在 tableView:heightForRowAtIndexPath: 中为外部 tableview 返回它。子 tableView 的高度只是其所有子项(包括任何页眉/页脚)的高度之和。这通常不难计算,除非您使用 webview 之类的东西,您需要实际加载内容并异步获取大小。您可以使用UIView.sizeThatFits(_:) 根据其内在内容大小计算元素的大小。情节提要中的其他元素应具有固定的大小或常量,您可以对其进行总结。
【讨论】:
但是在tableView:heightForRowAtIndexPath:
内部如何计算子表的高度?子表还没有加载,不是吗?【参考方案2】:
对于内部 tableView 你应该编写这样的实现。
首先,禁用 scrollEnable 标志
那么你应该重写tableView的intrinsicContentSize方法
你的内部 tableView 自定义类:
class IntrinsicTableView: UITableView
override var contentSize:CGSize
didSet
self.invalidateIntrinsicContentSize()
override var intrinsicContentSize: CGSize
self.layoutIfNeeded()
return self.contentSize
现在,删除高度约束,高度将根据其内容计算。
【讨论】:
仍然,单元格不会调整大小以适应表格。我还应该在主表上使用 heightForRowAt 还是 tableView.rowHeight? 是的,你应该设置estimatedRowHeight和rowHeight=UITableViewAutomaticDimension 不幸的是,这不起作用。高度确实发生了变化,但还不够。然后,我在包含 tableView 的单元格中添加了一个类,并向内表添加了高度约束,然后我创建了一个函数来在调用 contentSize didSet 时更改高度。再一次,高度发生了变化,但还不够。然后我尝试在单元类上使用self.frame.size.height = innerTable.contentSize.height
。这在设置了 innerTable contentSize 时被调用。这行得通。该表现在已完全显示。但是,它与下面的单元格重叠。以上是关于在单元格内显示整个表格视图的主要内容,如果未能解决你的问题,请参考以下文章
在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图