具有动态标签宽度的堆栈视图分布

Posted

技术标签:

【中文标题】具有动态标签宽度的堆栈视图分布【英文标题】:Stack View Distribution with Dynamic Label Width 【发布时间】:2019-12-20 07:12:05 【问题描述】:

我有一个 UIStackView 但是,subViews 的第一个视图是 UILabel,它没有相应地调整大小。

我的代码如下;

private let stackView: UIStackView = 
    let view = UIStackView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.axis = .horizontal
    view.distribution = .fillProportionally
    view.alignment = .trailing
    view.spacing = 8
    return view
()

当然,我在init 中添加我的subViews,如下所示;

    stackView.addArrangedSubview(currentBidLabel)
    stackView.addArrangedSubview(seperator)
    stackView.addArrangedSubview(adCreatedAtLabel)
    stackView.addArrangedSubview(moreButton)

我目前的结果如下图所示;

我要找的结果如下;

    红色 = 动态标签宽度(与蓝色相同) 绿色 = 固定宽度 蓝色 = 填充剩余空间 青色 = 固定宽度

【问题讨论】:

horizo​​ntal 堆栈视图不符合 .trailing 对齐方式。相反,您应该使用.fill/.top/.center/.bottom。您是否需要 AED 4001d 前 两个标签占用相同的宽度? 当我按比例填充时,我将视图粉碎成 0 宽度... 【参考方案1】:

您应该为每个标签设置所需的ContentHuggingPriority。以下设置将满足您的需求

redLabel.setContentHuggingPriority(. required, for: .horizontal)
greenLabel.setContentHuggingPriority(.required, for: .horizontal)
blueLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
cyanLabel.setContentHuggingPriority(.required, for: .horizontal)
defaultLow 表示填充其余部分。 required 表示首先适合。

其他值应该介于这两者之间。

【讨论】:

提供的图像是我现有结果的示例。我需要红色标签与文本一样宽,蓝色填充剩余空间。 你能张贴一张你想要的图片吗? 我通过 red = .required | 得到了想要的结果绿色 = .required |蓝色 = .defaultLow | cyan = .required(请更新您的答案,以便我接受) 嗯。我误解了你的例子。很高兴您解决了问题

以上是关于具有动态标签宽度的堆栈视图分布的主要内容,如果未能解决你的问题,请参考以下文章

动态宽度大小以适应堆栈视图中的控件

具有一个静态和一个动态子级的堆栈视图?

iOS:无法更改水平堆栈视图中的宽度

具有比例宽度和文本驱动高度的动态 UILabel

为啥图像视图会拉伸以填充 UIStackView 中宽度的一半?

StackView 子视图常量宽度