有没有办法更新故事板中大量约束的常量值?

Is there a way to update the constant value of a large number of constraints in a storyboard?

假设在我的情节提要中,我有一堆控制器视图,这些视图将它们的内容与具有特定插图的左边缘和右边缘对齐(例如:6pts 的填充)。如果我以后想更改该填充值,我如何才能快速在整个项目中进行更改?有没有办法在 Storyboard 中使用某个标记更改所有约束的常量,或者我是否必须创建一种 "contentView" class 并将其放在每个 [=14 的基础视图中=] 在我的项目中?

如果固定子视图的超级视图处于自动布局下,则在超级视图的大小检查器中它有一个布局边距部分。因此,如果这些子视图被固定到布局边距(这是在 Interface Builder 中创建约束时的默认设置),您所要做的就是更改父视图的布局边距。

这很简单,但是没有神奇的方法可以一步完成故事板中的所有超级视图(除非你想变得非常大胆并将故事板编辑为文本 - 它只是 [=毕竟 14=]。

您可以使用 NSLayoutConstraint 的自定义子 class 获得您想要的效果:

class AdjustableConstraint: NSLayoutConstraint {

    @IBInspectable var name: String = ""

    class func setConstant(ofConstraintsNamed name: String, to value: CGFloat) {
        constantForName[name] = value
        NSNotificationCenter.defaultCenter().postNotificationName(notificationName,
            object: self, userInfo: [nameKey: name])
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: #selector(AdjustableConstraint.observeAdjustmentNotification(_:)),
            name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)

        updateConstant()
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self,
            name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)
    }

    @objc private func observeAdjustmentNotification(note: NSNotification) {
        guard
            let userInfo = note.userInfo
            where userInfo[AdjustableConstraint.nameKey] as? String == name
        else { return }

        updateConstant()
    }

    private func updateConstant() {
        if let newConstant = AdjustableConstraint.constantForName[name] {
            self.constant = newConstant
        }
    }

    private static var constantForName = [String: CGFloat]()
    private static let notificationName = "UpdateAdjustableConstraintConstant"
    private static let nameKey = "name"


}

这是使用方法。对于情节提要中要一起调整的所有约束,将它们的自定义 class 设置为 AdjustableConstraint。 (您可以 select 文档大纲中的多个约束以同时设置所有约束的自定义 class。)

这样做将使 Xcode 在属性检查器中为这些约束显示一个新字段“名称”。将名称设置为一些字符串,例如“customMargin”:

在您的代码中,您可以为每个 AdjustableConstraint 设置一个特定名称的常量,如下所示:

AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 10)

当从情节提要中加载 AdjustableConstraint 时,如果您之前为其名称设置了常量,它将应用该常量。所以这也适用于新加载的约束。您可能希望在加载任何约束之前初始化常量,方法是在启动时在您的应用程序委托中设置它:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 30)
    return true
}