如何根据里面的单元格自动设置 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 的高度?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据里面的 UILabel 子视图调整 UICollectionView 中的单元格大小
如何根据动态高度单元格设置 UITableView 的高度约束?