以编程方式更改UIStackView中1个子视图的大小

时间:2019-02-16 14:14:25

标签: ios swift uistackview

我当前正在制作计算器,并且想将我的0按钮的大小更改为2个子视图的大小,这是整个视图大小的一半。我希望它看起来完全像苹果计算器应用程序,其中0比其他所有按钮都要大。
我布局视图的方式是通过使用垂直UIStackView并在其中添加水平UIStackView,如下图所示。 enter image description here

因此,我希望最后一个水平堆栈具有3个排列的子视图,但使0按钮填充超出的空间,因此,=按钮的大小与所有其他按钮。

谢谢。

2 个答案:

答案 0 :(得分:1)

对于前四个水平Stackview,可以使用stackview.distribution = .fillEquallly;对于最后一个水平Stackview,可以使用stackview.distribution = .fillPropotionally。

然后将0按钮的约束条件设置为上一水平Stackview宽度的50%。

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

以编程方式,您可以将乘数与constraint(equalTo:multiplier:)(官方文档:https://developer.apple.com/documentation/uikit/nslayoutdimension/1500951-constraint

因此,我们可以将最后两个按钮的宽度限制为相同,并使第一个按钮的长度比其他两个按钮的长度长两倍。

    override func viewDidLoad() {
        super.viewDidLoad()


        view.backgroundColor = .white

        let btn1 = UIButton()
        let btn2 = UIButton()
        let btn3 = UIButton()

        btn1.backgroundColor = .red
        btn2.backgroundColor = .yellow
        btn3.backgroundColor = .blue

        let hStack = UIStackView(arrangedSubviews: [btn1, btn2, btn3])
        hStack.axis = .horizontal
        hStack.spacing = 1

        view.addSubview(hStack)
        hStack.translatesAutoresizingMaskIntoConstraints = false
        hStack.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        hStack.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        hStack.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        // Here would be what you need:
        btn2.widthAnchor.constraint(equalTo: btn3.widthAnchor).isActive = true
        btn1.widthAnchor.constraint(equalTo: btn2.widthAnchor, multiplier: 2).isActive = true
    }

enter image description here