如何实现自定尺寸 UITableView?

Posted

技术标签:

【中文标题】如何实现自定尺寸 UITableView?【英文标题】:How to implement a self sizing UITableView? 【发布时间】:2018-07-23 16:34:28 【问题描述】:

我想根据 UITableView 的内容动态调整其大小。由于 UITableView 没有内在的内容大小,我必须以编程方式操纵高度约束。但是,我想要一个max_height,之后 UITableView 停止增长。

每次重新加载时,我都会将 UITableView 的高度约束设置为它的 contentSize。如果 contentSize 大于适合定义的边界,AutoLayout 会抱怨它“不能同时满足约束”。所以我尝试给 UITableView 的高度约束优先级 999。据我了解,如果 AutoLayout 必须打破约束,它会首先打破优先级最低的约束,并尝试尽可能接近常量。 (完美!)

如果 TableView 上方的所有内容都是固定高度,则可以正常工作,如下所示:

一旦 TableView 之上的任何内容依赖于固有 contentSize(如具有两个标签的 StackView),它就不再起作用了。一旦高度约束变得太大,任何没有固定高度的东西都会被压缩。 (将压缩阻力设置为 751 并将内容拥抱优先级设置为 249 不会改变这一点)

为了更容易验证我已经创建了一个 GitHub 项目 (https://github.com/Shanakor/SelfSizing-TableView/branches)。在“master”分支上,您将找到工作副本,在“not_working”分支上,您将找到替代方法。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

即使您更改了问题描述,原因仍在于约束的优先级。您的 stackview 高度是根据其固有尺寸定义的。这又是根据排列视图的固有大小或高度约束定义的(在这种情况下,它是标签的固有大小)。因此,如果您希望堆栈视图保持其大小(即抵抗压缩),则(堆栈视图及其所有排列视图的)抗压缩优先级应高于表视图高度约束的优先级。

所以你需要设置table view height constraint优先级低于UILayoutPriorityDefaultHigh(即至少749)和stackView的默认压缩阻力

【讨论】:

但是它将覆盖约束(> = 16)。我不要那个。当 TableView 达到其最大高度时,它应该停止增长。 如果你没有改变 (>=16) 约束的优先级,它的优先级是UILayoutPriorityRequired,所以它不会被覆盖。在其他情况下,将您的约束优先级添加到您的问题中,我会尽力提供帮助 感谢您的回答。我的 TableViewHeightConstraint 的优先级为 999。所有其他的优先级为 1000。 据我了解,一旦它变得太大,Autolayout 会尝试降低高度限制,对吧?所以这给我留下了不一致的布局。 Autolayout 不会直接删除它。它仍然会考虑计算表格视图的高度,但如果约束不能与所需的约束一起满足,则会在最后一个顺序中考虑。 IE。 (>=16) 约束实际上并没有设置底部边缘和按钮之间的距离,但与包括 tableview 高度在内的其他约束一起,很清楚该距离应该是多少

以上是关于如何实现自定尺寸 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 UICollectionViewCell 中的自定尺寸 UITableView

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

如何从 PrepareForReuse 的 UITableView 自定义行中删除视图?

iOS UICollectionView 与自定尺寸项目错误?

如何设置自定尺寸单元 iOS8

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