【问题标题】:Programmatically changing size of 1 subview in UIStackView以编程方式更改 UIStackView 中 1 个子视图的大小
【发布时间】:2019-02-16 22:48:30
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: ios swift uistackview


    【解决方案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
        }
    

    【讨论】:

    • 我用你的方法来解决我的问题。我的stackview是使用自动布局的layoutet,我无法访问我以前生成的任何按钮,因为我使用循环来生成它们。因此,我想通过使用UIStackView 框架宽度来设置按钮宽度。我的问题是调用 viewDidLoad 时没有计算框架。因此我将按钮宽度设置为 0。解决方案是在layoutSubviews() 中布局我的视图,这里计算了框架,因此我可以访问宽度。
    • @SørenGade 顺便说一句,您尝试设置 lazy var
    • 我不明白,使用惰性 var 做什么?无论如何,每个变量和视图最终都会被计算出来。
    【解决方案2】:

    您可以对前 4 个水平堆栈视图使用 stackview.distribution = .fillEquallly,对最后一个水平堆栈视图使用 stackview.distribution = .fillPropotionally。

    然后将 0 按钮的约束设置为最后一个水平堆栈视图宽度的 50%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-07
      • 2016-07-27
      • 2020-05-12
      • 2015-08-24
      • 2013-09-06
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多