Swift - 如何在 Horizo​​ntal StackView 中设置可变数量按钮之间的间距?

Swift - How to set spacing between variable number of buttons in Horizontal StackView?

我正在使用最多可包含 3 UIButton 的水平 UIStackView。 (可能只是 1,可能是 2,或 3)

我想让它们居中,它们之间的 space 相同,如下所示:

我似乎无法解决这个问题...我已经尝试了 DistributionAlignment 的所有组合,但我做不对。

这是 stackView 的限制条件:

fileprivate func setupStackViewConstraints() {
    stackView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        stackView.topAnchor.constraint(equalToConstant: 60),
        stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
        stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
        stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
    ])
}

这里是按钮的约束:

fileprivate func setupFacebookButton() {
    let facebookButton = UIButton()
    
    facebookButton.setImage(UIImage(named: "facebookSocialIcon"), for: .normal)
    facebookButton.imageView?.contentMode = .scaleAspectFit
    facebookButton.addTarget(self, action: #selector(facebookButtonWasTapped), for: .touchUpInside)
    
    // -----------------------------------
    
    facebookButton.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        facebookButton.widthAnchor.constraint(equalToConstant: 40),
        facebookButton.heightAnchor.constraint(equalToConstant: 40)
    ])
    
    // -----------------------------------
    
    stackView.addArrangedSubview(facebookButton)
}

有什么想法吗?

尝试将您的 StackView 限制为仅居中 x 和 y(不限制它的前导和尾随锚点):

NSLayoutConstraint.activate([
    stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])

然后您可以将分布值保留为默认值并将间距值设置为您想要的值:

stackView.spacing = // 16px

这样 StackView 的宽度将等于内容宽度。

这里的分布和对齐很明显。你想要“等距”和“居中”。您还应该设置合适的 spacing.

“难点”是如何让排列的视图在中间水平对齐,因为 alignment 属性 只是关于垂直于 axis 的对齐方式。

关键是让stack view有一个灵活的宽度,水平居中对齐。这意味着删除前导和尾随约束,并添加中心 X 约束。

因此,这些是堆栈视图的约束:

NSLayoutConstraint.activate([
    stackView.topAnchor.constraint(equalToConstant: 60),
    stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])

请注意,堆栈视图将扩展其宽度以适应其中所有排列的子视图。这意味着如果你有太多排列的子视图,其中一些可能会离开屏幕。如果您希望它们“换行”到下一行,请考虑使用 UICollectionView 代替 :)