无法将类型“[NSLayoutConstraint]”的值转换为预期的参数类型 'NSLayoutConstraint'

Cannot convert value of type '[NSLayoutConstraint]' to expected argument type 'NSLayoutConstraint'

我正在使用 Xcode 9 beta 5 。我务实地添加了逆势

addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "H: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))

addConstraint(NSLayoutConstraint.constraints(withVisualFormat: "V: |-16-[v0]-16-|" , options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":thumbnailImageView]))

我遇到错误:

Cannot convert value of type '[NSLayoutConstraint]' to expected argument type 'NSLayoutConstraint'

错误图片

如何消除这个错误?

问题是 NSLayoutConstraint.constraints(withVisualFormat:options:metrics:views) returns 一组约束,而不仅仅是一个约束。

自 iOS8 起,建议 激活 约束而不是将它们添加到视图中。对于单个约束,您只需将其 isActive 属性 设置为 true,然后 iOS 会将该约束添加到适当的视图以激活它。

对于多个约束,使用NSLayoutConstraint.activate激活约束而不是将它们添加到视图中:

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[v0]-16-|", metrics: nil, views: ["v0":thumbnailImageView]))
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[v0]-16-|", metrics: nil, views: ["v0":thumbnailImageView]))

UIView有两种添加约束的方法:

  • func addConstraint(_ constraint: NSLayoutConstraint)

    需要 单个 NSLayoutConstraint

  • func addConstraints(_ constraints: [NSLayoutConstraint])

    需要 数组 NSLayoutConstraint 个实例

只要使用合适的API

你必须使用 'addConstraints' 而不是 'addConstraint'

是的,就我而言,我使用的是:

view.addConstraint(
    NSLayoutConstraint.constraints(
        withVisualFormat: "H:|[\(label)]|",
        options: [],
        metrics: nil,
        views: viewsDictionary
    )
)

遇到了同样的问题。你应该使用 addConstraints(with "s"):

view.addConstraints(
        NSLayoutConstraint.constraints(
            withVisualFormat: "H:|[\(label)]|",
            options: [],
            metrics: nil,
            views: viewsDictionary
        )
    )