"视图层次结构没有为约束做准备"错误Swift 3

Dhr*_*yay 5 xcode ios autolayout swift

我正在尝试添加一个按钮并以编程方式设置约束,但我一直收到此错误,无法弄清楚我的代码有什么问题.我在这里看了其他问题但是在我的情况下它们并没有太大帮助.

    btn.setTitle("mybtn", for: .normal)
    btn.setTitleColor(UIColor.blue, for: .normal)
    btn.backgroundColor = UIColor.lightGray
    view.addSubview(btn)
    btn.translatesAutoresizingMaskIntoConstraints = false

    let left = NSLayoutConstraint(item: btn, attribute: .leftMargin, relatedBy: .equal, toItem: view, attribute: .leftMargin, multiplier: 1.0, constant: 0)

    let right = NSLayoutConstraint(item: btn, attribute: .rightMargin, relatedBy: .equal, toItem: view, attribute: .rightMargin, multiplier: 1.0, constant: 0)

    let top = NSLayoutConstraint(item: btn, attribute: .top, relatedBy: .equal, toItem: topLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0)

    btn.addConstraints([left, right, top])
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 9

添加约束到的图,"所涉及的任何意见[在约束]必须是接收视图本身,或接收视图的子视图".您正在添加约束btn,因此它不理解view约束引用的内容,因为它既不是btn也不是子视图btn.如果您将约束添加到view,而不是,则会解决该错误btn.

或者甚至更好,正如Khalid所说,使用activate相反,在这种情况下,您不必担心在视图层次结构中添加约束的位置:

let btn = UIButton(type: .system)
btn.setTitle("mybtn", for: .normal)
btn.setTitleColor(.blue, for: .normal)
btn.backgroundColor = .lightGray
view.addSubview(btn)
btn.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint.activate([
    btn.leftAnchor.constraint(equalTo: view.leftAnchor),
    btn.rightAnchor.constraint(equalTo: view.rightAnchor),
    btn.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)
])
Run Code Online (Sandbox Code Playgroud)