Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-如何在水平堆叠视图中设置可变数量按钮之间的间距?_Swift_Autolayout_Nslayoutconstraint_Uistackview - Fatal编程技术网

Swift-如何在水平堆叠视图中设置可变数量按钮之间的间距?

Swift-如何在水平堆叠视图中设置可变数量按钮之间的间距?,swift,autolayout,nslayoutconstraint,uistackview,Swift,Autolayout,Nslayoutconstraint,Uistackview,我正在使用一个水平UIStackView,它最多可以包含3个UIButtons。(可以是1、2或3) 我想让它们居中,它们之间有相同的空间,就像这样: 我好像没办法把这事办好。。。我尝试了分发和对齐的每一种组合,但都做不好 以下是stackView的约束条件: fileprivate func setupStackViewConstraints() { stackView.translatesAutoresizingMaskIntoConstraints = false

我正在使用一个水平
UIStackView
,它最多可以包含3个
UIButton
s。(可以是1、2或3)

我想让它们居中,它们之间有相同的空间,就像这样:

我好像没办法把这事办好。。。我尝试了
分发
对齐
的每一种组合,但都做不好

以下是
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)
}
以下是按钮的限制条件:

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中心(而不是限制其前导和尾随锚定):

然后,可以将分布值保留为默认值,并将间距值设置为所需值:

stackView.spacing = // 16px

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

尝试仅将StackView约束为中心x和y(而不是约束其前导和尾随锚定):

然后,可以将分布值保留为默认值,并将间距值设置为所需值:

stackView.spacing = // 16px

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

这里的分布和对齐是显而易见的。您需要“等间距”和“中心”。您还应该设置合适的
间距

“硬位”是如何使排列的视图在中间水平对齐的,因为<代码>对齐< /代码>属性仅与垂直于<代码>轴< /代码>对齐。

关键是让堆栈视图具有灵活的宽度,并在中心水平对齐。这意味着删除前导约束和尾随约束,并添加中心X约束

因此,以下是堆栈视图上的约束:

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

请注意,堆栈视图将扩展其宽度以适应其中所有排列的子视图。这意味着,如果排列的子视图过多,其中一些可能会脱离屏幕。如果你想让它们“打包”到下一行,考虑使用<代码> uICLoopDebug视图>代码>:(

这里的分布和对齐是显而易见的。您需要“等间距”和“中心”。您还应该设置合适的
间距

“硬位”是如何使排列的视图在中间水平对齐的,因为<代码>对齐< /代码>属性仅与垂直于<代码>轴< /代码>对齐。

关键是让堆栈视图具有灵活的宽度,并在中心水平对齐。这意味着删除前导约束和尾随约束,并添加中心X约束

因此,以下是堆栈视图上的约束:

NSLayoutConstraint.activate([
    stackView.topAnchor.constraint(equalToConstant: 60),
    stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])
请注意,堆栈视图将扩展其宽度以适应其中所有排列的子视图。这意味着,如果排列的子视图过多,其中一些可能会脱离屏幕。如果您希望它们“打包”到下一行,请考虑使用<代码> uICLoopDebug视图> />代码>:(<)/P>