在自定义单元

时间:2017-04-11 16:50:19

标签: ios uitableview autolayout interface-builder uistackview

我在水平堆栈视图中有两个标签。标签的numberOfLines设置为0,因此它们将无限包装,Vertical Content Compression Resistance设置为1000,因此它们将始终为其全高,Horizo​​ntal Compression Resistance设置为250,因为我希望它们能够缩小,和内容拥抱设置为1000(两个轴,因为我总是希望框架拥抱标签)。参见:

Interface Builder screenshot

然后,该堆栈视图是自定义单元格中的唯一项目。它受限于顶部,底部,前导和尾随边距。堆栈视图具有与标签相同的压缩阻力/内容拥抱。

在运行时,在我的cellForRowAt indexPath函数中,我将两个标签设置为不同长度的文本。既然我在其他地方读到布局可能会成为一个问题,我也会这样做:

    cell.contentView.setNeedsLayout()
    cell.contentView.layoutIfNeeded()

然而,当我跑步时,我最初看到一些奇怪的行为。但是当我滚动时,事情开始变得好看。似乎问题与细胞重用有关,但我无法弄清楚是什么问题。

Simulator Screen Shots

在左边 - 初始加载。注意,值标签被完全切断,而在第二个单元格中,比例间距似乎根本不起作用 - 与名称标签相比,值标签非常窄。

在右侧 - 表格一旦滚动到列表底部并返回顶部。这正是我所期望的:标签根据其内在内容大小按比例间隔。但是,如何在不必滚动的情况下获得此行为?

1 个答案:

答案 0 :(得分:0)

我相信您最大的问题是使用Horizo​​ntal StackView,您的宽度是根据堆叠的内容动态计算的。将StackView限制为特定宽度,根据宽度约束,更大的工作就是如何计算内容的宽度。然后你投入无限的线条,这使得动态宽度更具挑战性,因为必须有一些门槛。

我建议为FieldName或FieldValue定义一个宽度,可以是基于父宽度百分比的常量或相对宽度。我非常确定你的拥抱和压缩只会互相争斗,因为FieldName有时会比FieldValue长,有时它恰恰相反。

你必须在某处设置硬限制。