2017-04-11 164 views
2

我在水平堆栈视图中有两个标签。标签有numberOfLines设置为0,因此它们将无限包裹,垂直内容压缩电阻设置为1000,因此它们将始终是它们的全高,水平压缩电阻设置为250,因为我希望它们能够缩小,并且内容拥抱设置到1000(两轴,因为我总是希望框架拥抱标签)。请参阅:按比例分布的UIStackView在自定尺寸的单元格中

Interface Builder screenshot

然后该栈的观点是在自上浆细胞的唯一项目。它受限于顶部,底部,顶部和尾部边距。堆叠视图与标签具有相同的抗压缩/内容拥抱。

在运行时,在我的cellForRowAt indexPath函数中,我将两个标签设置为不同长度的文本。而且,因为我已经在别处读到布局可以是一个问题在这里,我也做:

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

然而,当我跑,我开始看到一些奇怪的行为。但是当我滚动时,事情开始看起来没问题。看起来问题与细胞再利用有关,但我无法弄清楚什么是错误的。

Simulator Screen Shots

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

在右侧 - 表格滚动到列表底部并返回顶部。这正是我所期望的:标签是根据其内在内容大小按比例分配的。但是我怎样才能得到这种行为,而不必滚动?

+0

您是如何计算标签宽度的?因为在上面的例子中,右标签非常窄(单词“No”的宽度)......但在下面的例子中,右标签宽于50%...... – DonMag

+0

@DonMag - 根据Apple的关于堆栈视图的文档,当您按比例选择fill的分布属性时,“视图将根据堆栈视图轴上的内在内容大小按比例调整大小。” 所以我期望的是根据标签的内在内容大小来计算宽度。当单元格被重用时,这似乎工作正常,但在单元格第一次加载时似乎没有问题。 –

+0

肯定...除了内容大小是什么?对于单个标签,默认字体为17,“水果蛋糕”文本的*固有内容大小*本身为“528 x 20.5”...如果限制宽度 - 通过在标签上设置约束或将其嵌入到具有宽度约束的堆栈视图中,则会将其包装为多行(如果需要),并且*内在高度*将更改...但是如果你有两个标签,你希望获得哪个内在高度? – DonMag

回答

0

我相信你最大的问题是水平堆栈视图,你的宽度是基于堆叠的内容动态计算的。在您的StackView限制到特定宽度的情况下,根据您的宽度约束,较大的工作变成如何计算内容的宽度。然后你投掷无限的线条,这使得动态宽度更具挑战性,因为必须有一些门槛。

我建议为FieldName或FieldValue定义一个宽度,无论是常量还是基于父宽度百分比的相对宽度。我很确定你的拥抱和压缩只会与对方发生冲突,因为FieldName有时可能比FieldValue更长,有时却相反。

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

+0

令人沮丧的是,它在细胞再利用方面效果很好。这些问题仅在单元格从故事板加载时才会出现。必须有某种内在的魔力,它在第一次加载它们时计算正确的宽度。我可能会向苹果提交TSI,让UIKit工程师对此进行评论。 –

+0

我真的不认为有任何苹果问题。我认为这是理解API如何工作的问题。我想告诉你,你刚才说的是,第一次加载后没有任何“正确的宽度”。从这里只有最初的计算和显示,有些东西必须告诉单元对自定义宽度绘制正确和不均匀。无论你说的是什么作品“很棒”都是由于设备类型而产生的纯粹情况。 – kruskop

+0

为了尽可能明确:我告诉你为其中一个内容的宽度设置一个“硬”限制,因为这两个标签都有能力运行到无穷大。您正在体验宽度问题,因为你期望不存在的魔法。 – kruskop