Swift UITableView 自动高度

Posted

技术标签:

【中文标题】Swift UITableView 自动高度【英文标题】:Swift UITableView auto height 【发布时间】:2018-08-31 11:51:44 【问题描述】:

我有一个设计,其中 UITableView 与其他内容一起在 UIScrollView 中,并且内容随着表格数据滚动。这意味着,该表格已禁用滚动并被拉伸至全尺寸。

我正在使用自动布局,并且表格有高度限制,设置为一些默认值。

然后我已经覆盖了 viewWillLayoutSubviews 方法:

override func viewWillLayoutSubviews() 
    super.viewWillLayoutSubviews()
    if (self.itemTableView.contentSize.height > 0) 
        self.itemTableViewHeightConstraint.constant = self.itemTableView.contentSize.height
    

有了这个方法,当我从 REST 加载数据后调用 self.itemTableView.reloadData() 时,高度约束设置为表格内容高度,这很棒。

这曾经在许多项目中为我工作,但由于某种原因,它在最新的项目中不起作用,用 swift 4 编写。有什么改变吗?为什么tableView reloadData() 方法没有调用viewWillLayoutSubviews()?

【问题讨论】:

您永远不应该在 UIScrollView 中嵌入 UITableView。您可以使用表格中的页眉或页脚视图,或者在不同部分中为您的其他可滚动数据在表格视图的内容单元格周围添加自定义单元格 它应该可以正常工作。检查任何其他可能的问题 @TmKVU 谢谢,这是有道理的。我会考虑这种方法。 @Satish 我认为它应该可以工作,因为我在我的旧项目中使用它并且它正在工作。但由于某种原因,它在这个中不起作用。所以我想知道最近 Swift 是否发生了一些变化。 ios11+ 添加了“contentLayoutGuide”和“frameLayoutGuide”约束,它们改变了将子视图约束为滚动视图的方式。 【参考方案1】:

问题是 tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) 在返回行之前没有调用 self.view.setNeedsLayout()。

【讨论】:

以上是关于Swift UITableView 自动高度的主要内容,如果未能解决你的问题,请参考以下文章

swift 使用“自动布局”将UITableView的高度设置为其内容的高度

uitableviewcell中的swift uitableview,自动布局始终高度为0

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?

Firebase 与 Swift 3.0 UITableView

iOS:在 Swift 中动态设置 UITableView 高度

UITableView“dequeueReusableCellWithIdentifier”导致基于单元格内容的动态单元格高度的单元格重叠?