【问题标题】:Xcode; Set a autolayout constraint to a defined variable value代码;将自动布局约束设置为定义的变量值
【发布时间】:2016-02-11 18:02:20
【问题描述】:

是否可以定义一个变量,并为该变量设置一个约束常量值?

从而可以通过更改变量来更改许多约束。我想我看到有人直接从界面构建器中做到这一点?

编辑:

每个标签之间都有一个约束。我需要一种方法来更改所有这些约束,以便它们获得相同的值。这可能吗?

如果我使用插座集合,我将不得不遍历所有约束,并更改每个约束的值。我正在寻找这样的方法:

// SEUDO!!
lineSeperationWidth = 31    // changes all 4 constraints.

【问题讨论】:

    标签: ios xcode autolayout interface-builder nslayoutconstraint


    【解决方案1】:

    是的!您可以使用文档大纲视图来查找要用作变量的约束。一旦你有了它, CTRL + 从文档大纲视图中的约束拖动到你的代码以制作出口。然后您可以使用self.constraint.constant = 31 更改代码中的约束。

    要使所有视图均匀分布,您可以将UILayoutGuides 放在每个标签之间,并将它们的所有高度限制为相等。然后您可以更改其中一个布局指南的高度,它们都会更改以匹配它。

    【讨论】:

    • 很好.. 非常感谢 :) 但这仍然不允许我通过更改一个变量来设置多个约束.. 看看我添加的新图像..
    • 这不是问题的答案
    【解决方案2】:

    NSLayoutContraints 都是独立的对象,Xcode 无法使用同一个变量设置多个约束的constant 值。最接近的方法是使用 @IBOutlet 集合,然后使用 didSet property observer 作为保存公共空间值的变量来更新集合中的每个约束。

    这是我创建的一个示例,它根据我每次按下Go 按钮时设置为space 属性的随机值分隔标签:

    class ViewController: UIViewController {
    
        @IBOutlet var spacers: [NSLayoutConstraint]!
    
        var space: CGFloat = 20.0 {
            didSet {
                spacers.forEach { $0.constant = space }
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func spaceOut(sender: AnyObject) {
            // set space to a random value
            space = CGFloat(arc4random_uniform(30)) + 20.0
        }
    
    }
    

    标签之间的每个垂直空间约束都连接到@IBOutlet 集合spacers。以下是 Connections Inspector 显示的内容:


    它在行动:

    【讨论】:

    • 任何更新,现在是否可以在没有集合且无需在代码中设置约束但直接在 Xcode 中(在 Xcode 12.4 中)中设置约束?
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2014-03-24
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多