Swift:如何强制UIabel占用剩余的可用空间

Swift:如何强制UIabel占用剩余的可用空间,swift,uilabel,interface-builder,Swift,Uilabel,Interface Builder,我有一个包含以下内容的UIView: UIButton:contentMode=Aspect Fit UILabel:numberOfLines=0,lineBreakMode=byWordWrapping,contentMode=Aspect Fill UISwitch: 我希望UILabel的宽度和行数能够适应UIButton和UILabel本地化文本的内容 我应该如何进行 预期的行为: ____________________________________________________

我有一个包含以下内容的UIView:

UIButton:contentMode=Aspect Fit UILabel:numberOfLines=0,lineBreakMode=byWordWrapping,contentMode=Aspect Fill UISwitch: 我希望UILabel的宽度和行数能够适应UIButton和UILabel本地化文本的内容

我应该如何进行

预期的行为:

____________________________________________________________________
|          |                                            |          |
| UIButton |                 UILabel                    | UISwitch |
|          |                     |                      |          |
_________________________________v__________________________________

Fred

您必须对其进行必要的约束,以使其符合您的要求。你需要提供更多的细节,以便我告诉你你想要的约束条件。当前信息假设按钮和开关具有固定宽度,并分别固定在superview末端的前导和尾随。然后检查以下约束

1给出标签的前导约束等于按钮的尾随约束 2给出标签的尾随约束等于开关的前导约束 3使按钮的顶部和底部约束等于标签的顶部和底部约束 4使开关的顶部和底部约束等于标签的顶部和底部约束

最后,为标签的y位置提供一个约束,就可以开始了


另一个可能的解决方案是使用水平堆栈视图,这将节省大量这些约束。

以下是我尝试的。。。但是我的按钮的大小并没有尽可能小,我将其挤出以适应文本

因此,我添加了这些约束

此视图将显示为func


你要找的东西叫做UIStackView horizontalI我是从一个UIStackView开始的,但是我的UISwitch不在屏幕上!!!虽然我的堆栈有正确的前导、尾随、顶部和底部约束:-约束不是问题,您必须设置压缩阻力和拥抱优先级。感谢@Sulthan,这是我的缺失点。我解决了我的问题,因为@Sulthan为我的UIButton添加了更高的拥抱优先级
NSLayoutConstraint.activate([
 resetButton.leadingAnchor.constraint(equalTo: bottomView.leadingAnchor),
 resetButton.trailingAnchor.constraint(equalTo: rawLabel.leadingAnchor),
 rawLabel.trailingAnchor.constraint(equalTo: directSwitch.leadingAnchor),
 directSwitch.trailingAnchor.constraint(equalTo: bottomView.trailingAnchor),
 resetButton.topAnchor.constraint(greaterThanOrEqualTo: bottomView.topAnchor),
 rawLabel.topAnchor.constraint(equalTo: bottomView.topAnchor),
 directSwitch.topAnchor.constraint(greaterThanOrEqualTo: bottomView.topAnchor),
 resetButton.bottomAnchor.constraint(lessThanOrEqualTo: bottomView.bottomAnchor),
 rawLabel.bottomAnchor.constraint(equalTo: bottomView.bottomAnchor),
 directSwitch.bottomAnchor.constraint(lessThanOrEqualTo: bottomView.bottomAnchor),
 resetButton.centerYAnchor.constraint(equalTo: bottomView.centerYAnchor),
 rawLabel.centerYAnchor.constraint(equalTo: bottomView.centerYAnchor),
 directSwitch.centerYAnchor.constraint(equalTo: bottomView.centerYAnchor)
])
override func viewWillAppear(_ animated: Bool) {
    resetButton.sizeToFit()
    rawLabel.numberOfLines = 0
    rawLabel.lineBreakMode = .byWordWrapping
    rawLabel.preferredMaxLayoutWidth = bottomView.frame.width - resetButton.frame.width - directSwitch.frame.width
}