多个灵活高度项 - 如何设置自动布局优先级?

时间:2017-06-26 23:24:37

标签: ios autolayout

假设您(例如)表格单元格布局包含 多个 动态弹性高度项目,

它们以明显的方式彼此垂直连接。

enter image description here

使这项工作变得非常困难,并且没有记录。

您希望:您将所有可展开项目的抗压强度设置为751 。但这不起作用。

经过随机实验,在我看来,令人惊讶的是你必须做这样的事情:

在250和750上压缩/拥抱整体视图,

enter image description here

然后奇怪的是,对于示例中的三个文本视图,优先级必须

...依次增加......

enter image description here

并且,我认为你必须让其中一个"一个更低"而不是整体观点 - 在这个例子中,其中一个是749。

很难/不可能找到确切的"公式"使其一致地工作。

这是什么原因?它只是iOS中的一个纯bug吗?

有没有人找到正确的公式"使扩展名的 数字 在单元格中工作?

  • 三个文本视图的优先级

  • 整体持有人观点的优先级

欢呼声

2 个答案:

答案 0 :(得分:4)

你的问题对我来说不是很清楚。但是,这是堆叠文本视图的好方法(无论你是否使用堆栈视图来约束它们都无关紧要):

1。禁用所有UITextView的滚动:

Disable scrolling in Identity Inspector

原因:如果启用了滚动功能,则UITextView没有已定义的intrinsicContentSize。见this answer。如果没有内在的内容大小,内容拥抱和抗压缩(“CHCR”)优先级没有任何意义或影响。

2。为每个视图沿一个轴提供CHCR的不同优先级:

更准确地说:为沿着一个轴的约束连接的所有视图提供不同的CHCR优先级,这些优先级沿着该轴约束<(即没有固定的宽度/高度约束) )。

在您的特定示例中,屏幕截图中显示的设置是正确的解决方案: 三个文本视图中的每一个具有不同的内容拥抱和不同的抗压缩优先级。作为一般规则,您应该从默认值(750/250)开始,并且只是稍微增加或减少它们。

如果您使用具有自定义单元格的表格视图(通过设置其estimatedItemSize),CHCR优先级在运行时无关紧要,因为单元格将自动调整大小以适应所有三个文本视图的足够空间。您只需将这些优先级设置为“静音”Interface Builder。

但是,如果使用固定高度表视图单元格,则CHCR优先级非常重要,因为它们确定

  • 如果单元格内部空间不足(最低抗压性优先级的视图),哪些视图将缩小
  • 如果单元格内部空间比子视图实际需要的空间更多,那么哪些视图将展开(这是最低内容拥抱优先级的视图)。

superview(“MV”)的CHCR优先级是无关紧要的,因为它通常只是一个没有定义intrinsicContentSize的容器视图。它的大小由您添加的内部和外部约束定义。

有关CHCR优先级的更多信息,请参阅自动布局指南中的Intrinsic Content Size一章。

答案 1 :(得分:-1)

当我使用具有可变高度的单元格时,我使用:

tableView.estimatedRowHeight = 20.0
tableView.rowHieght = UITableViewAutomaticDimension

这两个导致表视图呈现其具有适当高度的单元格。为了计算高度,您应该在tableView(cellForRowAt)

中设置单元格的数据