Xcode的;将autolayout约束设置为已定义的变量值

时间:2015-11-10 18:37:10

标签: ios xcode autolayout interface-builder nslayoutconstraint

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

从而可以通过仅改变变量来改变许多约束。我想我看到有人直接从界面建设者那里做到这一点?

Constraint of a view, from xcode's interface builder

修改

每个标签之间存在约束。我需要一种方法来改变所有这些约束,因此它们获得相同的值。这可能吗?

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

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

multiple similar constraints

2 个答案:

答案 0 :(得分:3)

NSLayoutContraint是所有单独的对象,Xcode无法使用相同的变量设置多个约束的constant值。最接近的是使用@IBOutlet集合,然后使用didSet 属性观察器为包含公共空间值的变量更新集合中的每个约束

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

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 显示的内容:

connections inspector

这是在行动:

enter image description here

答案 1 :(得分:0)

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

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