【问题标题】:Proportionally distributed UIStackView in self sizing cell在自定尺寸单元中按比例分布的 UIStackView
【发布时间】:2017-09-07 04:38:23
【问题描述】:

我在水平堆栈视图中有两个标签。标签将 numberOfLines 设置为 0,因此它们将无限包裹,垂直内容压缩阻力设置为 1000,因此它们将始终是它们的全高,水平压缩阻力设置为 250,因为我希望它们能够收缩,并且内容Hugging 设置为 1000(两个轴,因为我总是希望框架拥抱标签)。见:

Interface Builder screenshot

那么堆栈视图是自调整单元格中的唯一项目。它被限制在顶部、底部、前导和尾随边距。堆栈视图具有与标签相同的压缩阻力/内容拥抱。

在运行时,在我的 cellForRowAt indexPath 函数中,我将两个标签设置为不同长度的文本。而且由于我在其他地方读到过这里的布局可能是一个问题,所以我也这样做:

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

但是,当我跑步时,我最初看到了一些奇怪的行为。但是当我滚动时,事情开始看起来不错。似乎问题与细胞重用有关,但我不知道出了什么问题。

Simulator Screen Shots

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

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

【问题讨论】:

  • 您希望如何计算标签宽度?因为在上面的例子中,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


【解决方案1】:

我相信您最大的问题是水平 StackView,您的宽度是根据堆叠的内容动态计算的。将 StackView 限制为特定宽度,根据您的宽度限制,更大的工作变成了如何计算内容的宽度。然后你会抛出无限的线条,这使得动态宽度更具挑战性,因为必须有一些阈值。

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

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

【讨论】:

  • 令人沮丧的是它在单元重用方面效果很好。只有在最初从情节提要加载单元格时才会出现问题。一旦第一次加载它们,它必须有某种底层魔法来计算正确的宽度。我可能会向 Apple 提交 TSI,让 UIKit 工程师对此发表评论。
  • 老实说,我不认为苹果有任何问题。我认为这是了解 API 是如何工作的问题。我想告诉你的是,你刚才说的是,没有任何“第一次加载后的正确宽度”。只有初始计算和显示,从这里必须告诉单元格正确绘制并且自定义宽度不均匀。无论您说什么“很棒”,都取决于设备类型。
  • 为了尽可能明确:我告诉您为内容的宽度之一设置“硬”限制,因为这两个标签都有能力进入无穷大。您遇到了宽度问题,因为您期望不存在的魔法。
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 2014-11-11
  • 2019-12-04
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多