Swift stackview如何动态更改嵌套在其内部的元素之间的间距

Swift stackview如何动态更改嵌套在其内部的元素之间的间距,swift,xcode,autolayout,uistackview,Swift,Xcode,Autolayout,Uistackview,几个月来,我一直在试图了解StackView及其工作原理。出于这个原因,我创建了一个项目,其中有4个按钮嵌套在一个宽度和高度恒定的堆栈视图中。现在,根据iPhone的屏幕大小,我希望stackview中的按钮保持其宽度和大小,但它们之间的间距变小或变大。如果我使用鼠标手动调整stackview的大小,这将非常完美。但是,当我添加应该具有相同效果的顶部和底部约束时,堆栈视图中的按钮会收缩或奇怪地拉伸,即使它们都具有恒定的高度且优先级设置为1000 您可以自己尝试创建一个堆栈视图,其中包含一些按钮,

几个月来,我一直在试图了解StackView及其工作原理。出于这个原因,我创建了一个项目,其中有4个按钮嵌套在一个宽度和高度恒定的堆栈视图中。现在,根据iPhone的屏幕大小,我希望stackview中的按钮保持其宽度和大小,但它们之间的间距变小或变大。如果我使用鼠标手动调整stackview的大小,这将非常完美。但是,当我添加应该具有相同效果的顶部和底部约束时,堆栈视图中的按钮会收缩或奇怪地拉伸,即使它们都具有恒定的高度且优先级设置为1000

您可以自己尝试创建一个堆栈视图,其中包含一些按钮,然后将其宽度和高度设置为常量。然后添加顶部和底部约束,并在比您正在创建它的屏幕更小的屏幕上预览它

在iPhone XS上预览,如果屏幕较小,按钮之间的间距应动态更改为较大或较小:

在iPhone 8上预览:

以及它应该是什么样子:


有人能给我解释一下为什么会发生这种情况,以及我如何才能达到我想要的结果吗?

您不应该添加底部约束,而应该只向
UIStackView
添加高度约束,检查以下示例

let buttons = [UIButton(), UIButton(), UIButton(), UIButton()]
for (index, button) in buttons.enumerated() {
    button.backgroundColor = .red
    button.setTitle("Category Button \(index)", for: .normal)
    button.setTitleColor(.black, for: .normal)
}
let stackView = UIStackView(arrangedSubviews: buttons)
stackView.axis = .vertical
stackView.distribution = .equalSpacing
stackView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(stackView)

let salGuide = self.view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
    stackView.topAnchor.constraint(equalTo: salGuide.topAnchor, constant: 16.0),
    stackView.centerXAnchor.constraint(equalTo: salGuide.centerXAnchor, constant: 0),
    stackView.widthAnchor.constraint(equalTo: salGuide.widthAnchor, multiplier: 0.6),
    stackView.heightAnchor.constraint(equalTo: salGuide.heightAnchor, multiplier: 0.6)
])
请注意,
multiplier:0.6
UIStackView
提供了60%的可用宽度和高度,要使用恒定宽度/高度,只需将参数名称从
multiplier
更改为
constant
,并提供适当的参数值

iPhone SE

iPhone Xs Max


你想要实现什么?