强制视图在 UIStackView 中占用尽可能多的空间

Posted

技术标签:

【中文标题】强制视图在 UIStackView 中占用尽可能多的空间【英文标题】:Force a view to take as much space as possible inside UIStackView 【发布时间】:2018-05-24 14:14:15 【问题描述】:

我正在使用 Swift 创建我的应用程序 UI 的一部分,我面临的问题是我有一个带有 3 个子视图的 UIStackView:2 个 UILabel 和一个 UIImageView。这是我的第一个代码

let switchview = UISwitch()
let nodelableview = UILabel()
nodelableview.textAlignment = NSTextAlignment.right
nodelableview.numberOfLines = 0
nodelableview.text = nodes[i].type + " " + nodes[i].node_name
let statLabel = UILabel()
statLabel.textAlignment = NSTextAlignment.left
statLabel.text = nodes[i].stat
let stack = UIStackView()
stack.axis = .horizontal
stack.spacing = 16
stack.addArrangedSubview(statLabel)
stack.addArrangedSubview(nodelableview)
stack.addArrangedSubview(switchview)
cell.nodesView.addArrangedSubview(stack)

此代码的问题在于,当nodelabelview 有长文本时,UIStackView 没有扩展为 2 行或更多行腾出空间。所以我将对齐设置为.center,这是结果

还有空余空间,但第一个 UILabel 无用。如何强制第二个 UILabel 使用可用空间?

【问题讨论】:

您可以尝试将分布设置为“按比例填充”和左侧标签的内容压缩阻力(水平)并切换为1000。 这条cell.nodesView.addArrangedSubview(stack) 行实际上是做什么的?您是否将此水平堆栈视图插入到单元格的另一个堆栈视图中,即nodesView?为什么有必要? 我的 tableview 中有一个单元格来过滤 tableview 中的其他单元格,我正在向它添加过滤器选项@nayem 感谢您解决了我的问题。请将其作为答案发布@Alladinian @Amir_P 完成。很高兴能帮到你:) 【参考方案1】:

优先考虑您的第二个标签(行数不受限制的标签)的设置将是设置为“Fill Proportionally”分布的堆栈视图(这意味着视图的大小基于它们的内在大小和拥抱/抵抗优先级)

结合左侧标签和开关的水平“内容压缩阻力优先级1000(“必需”)和开关(表示“不压缩”)

解决了这个问题:

【讨论】:

请记住,在实际内容大小可能发生变化的内容压缩中最好避免使用 1000 的优先级,因为它们很容易破坏布局的其余部分。在堆栈视图中尤其如此,因为堆栈视图使用约束来折叠隐藏的元素,因此可能会将相关项目设置为隐藏。 @Ash True... 但问题中没有提到这些情况。话虽如此,您的观点是有效的(由于隐藏的具有“必需”优先级的托管视图,我无法计算我看到记录警告的次数)。感谢您的评论:) 是的,或者因为其中两行具有相同的拥抱/压缩值而弄乱了堆栈视图:D【参考方案2】:

您可能需要为每个标签设置水平的contentHuggingPrioritycontentCompressionResistance/切换到与其他标签不同的东西,确保您希望扩展以填充剩余可用空间的标签具有最低的拥抱值。

【讨论】:

向容器视图添加视图时,容器视图有责任控制translatesAutoresizingMaskIntoConstraints 很高兴知道,尽管我认为其余的答案仍然相关。我已经编辑了我的答案以反映这一点。我不会回应 Alladinian 的回应。

以上是关于强制视图在 UIStackView 中占用尽可能多的空间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用堆栈视图自动布局标签和按钮?

在 iOS 上使用自动布局如何指定视图应占用尽可能多的空间?

隐藏内部视图时,UIStackView 将内容向左移动

动态 UIStackView 与普通约束

当轴垂直时在 UIStackView 的子视图上设置恒定宽度

使多视图按钮可点击