【发布时间】:2017-09-07 04:38:23
【问题描述】:
我在水平堆栈视图中有两个标签。标签将 numberOfLines 设置为 0,因此它们将无限包裹,垂直内容压缩阻力设置为 1000,因此它们将始终是它们的全高,水平压缩阻力设置为 250,因为我希望它们能够收缩,并且内容Hugging 设置为 1000(两个轴,因为我总是希望框架拥抱标签)。见:
那么堆栈视图是自调整单元格中的唯一项目。它被限制在顶部、底部、前导和尾随边距。堆栈视图具有与标签相同的压缩阻力/内容拥抱。
在运行时,在我的 cellForRowAt indexPath 函数中,我将两个标签设置为不同长度的文本。而且由于我在其他地方读到过这里的布局可能是一个问题,所以我也这样做:
cell.contentView.setNeedsLayout()
cell.contentView.layoutIfNeeded()
但是,当我跑步时,我最初看到了一些奇怪的行为。但是当我滚动时,事情开始看起来不错。似乎问题与细胞重用有关,但我不知道出了什么问题。
在左侧 - 初始负载。请注意,值标签被完全切断,在第二个单元格中,比例间距似乎根本不起作用 - 与名称标签相比,值标签非常窄。
在右侧 - 我滚动到列表底部并返回顶部后的表格。这正是我所期望的:标签根据其内在内容大小按比例排列。但是我怎样才能在不滚动的情况下获得这种行为呢?
【问题讨论】:
-
您希望如何计算标签宽度?因为在上面的例子中,right-label 很窄(“No”这个词的宽度)...但是在下面的例子中,right-label 的宽度超过了 50%...
-
@DonMag - 根据 Apple 关于 Stack 视图的文档,当您选择 fillProportionally 的分布属性时,“视图将根据其沿堆栈视图轴的内在内容大小按比例调整大小。”所以我期望的是根据标签的内在内容大小计算宽度。这在重复使用单元格时似乎可以正常工作,但在第一次加载单元格时就不行了。
-
当然...除了内在内容大小是多少?对于单个标签,默认字体为 17,您的“Fruitcake”文本本身的内在内容大小为
528 x 20.5...如果您限制宽度 - 通过在标签上设置约束或通过将其嵌入具有宽度约束的堆栈视图中,然后它将换行为多行(如果需要),并且 固有高度 将改变......但如果你有两个标签,哪个是内在高度你想获得优先权吗? -
@DonMag 我的意思是,我不知道 UIStackView 是如何工作的。我想它只是在单行上查看文本的内在内容大小,给定无限宽度,并使用该内容大小的区域来计算比例宽度。但我们真的无从得知,这就是为什么我想我可能会向 Apple 提交一份 TSI,看看他们是否可以让 UIKit 工程师对此发表评论。
-
试试
cell.mainStackView.setNeedsLayout() cell.mainStackView.layoutIfNeeded()(mainStackView 是一个出口)而不是cell.contentView.setNeedsLayout() cell.contentView.layoutIfNeeded()。它有什么改变吗?
标签: ios uitableview autolayout interface-builder uistackview