如何在水平stackview中居中按钮?

Posted

技术标签:

【中文标题】如何在水平stackview中居中按钮?【英文标题】:How to center button in horizonatal stackview? 【发布时间】:2018-09-26 20:43:17 【问题描述】:

我有一个带有两个按钮的水平堆栈视图。现在我想,如果一个按钮被隐藏,其他应该在中心。

喜欢,

[x   x]
[  x  ] 

【问题讨论】:

【参考方案1】:

将 UIStackView 的分布属性设置为 Fill Equally 从情节提要或以编程方式:

stackView.distribution = .fillEqually

一旦一个按钮被隐藏,另一个就会居中。

【讨论】:

【参考方案2】:

使用一些隐藏的 UIViews 怎么样?

在你的类中声明stackView:

var myFirstStack: UIStackView!
var bool = true

bool 是一个布尔值,用于模拟您想要隐藏或显示按钮时的情况。

初始化viewDidLoad中的stackView:

myStack = UIStackView(arrangedSubviews: createButtons("1", "2"))
let v1 = UIView()
v1.isHidden = true
let v2 = UIView()
v2.isHidden = true
myStack.insertArrangedSubview(v1, at: 1)
myStack.addArrangedSubview(v2)
myStack.translatesAutoresizingMaskIntoConstraints = false
myStack.axis = .horizontal
myStack.spacing = 20
myStack.distribution = .fillEqually

view.addSubview(myStack)

它使用这个功能:

func createButtons(_ named: String...) -> [UIButton] 
    var i = true
    return named.map  name in
        let btn = UIButton()
        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.setTitle(name, for: .normal)
        btn.backgroundColor = i ? .yellow : .red
        i.toggle()
        btn.setTitleColor(.black, for: .normal)
        return btn
    

添加自动布局约束:

myFirstStack.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
myFirstStack.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -20).isActive = true
myFirstStack.heightAnchor.constraint(equalToConstant: 100).isActive = true
myFirstStack.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

这是目前的样子:

当第三个按钮被点击时,UIViews 被隐藏或显示:

@IBAction func hide(_ sender: Any) 
    myFirstStack.arrangedSubviews[0].isHidden = bool  //This is the button to hide
    myFirstStack.spacing = bool ? -100 : 20           //Adjust the spacing to your liking 
    myFirstStack.arrangedSubviews[1].isHidden = !bool //Hide or show the first UIView
    myFirstStack.arrangedSubviews[3].isHidden = !bool //Hide or show the second UIView
    bool.toggle()

结果如下:

【讨论】:

以上是关于如何在水平stackview中居中按钮?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode如何在水平stackview中创建一个方形按钮(宽度等于高度)

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

如何在 JScrollPane 中居中垂直和水平滚动条?

在 UIScrollView 中居中 UIButtons

如何在 StackView 中设置等宽或等高?

如何在kivy中居中按钮?