Search code examples
swiftxcodeautolayout

Error: Thread 1: "Impossible to set up layout with view hierarchy unprepared for constraint." when using auto layout


My code is down below, and I don't know what makes this error appear. Some ideas?

Thread 1: "Impossible to set up layout with view hierarchy unprepared for constraint."
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        view.backgroundColor = .blue
        lbl1values()
    }
    
    
    
    
    let lbl1 = UILabel()
    
    
    func lbl1values(){
        lbl1.addConstraint(NSLayoutConstraint(item: lbl1,
                                              attribute: .leading,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .trailing,
                                              multiplier: 1.0,
                                              constant: 8.0))
    
        lbl1.addConstraint(NSLayoutConstraint(item: lbl1,
                                              attribute: .top,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .bottom,
                                              multiplier: 1.0,
                                              constant: -8.0))
        
        view.addSubview(lbl1)
    }
}

I have already tried to call 'lbl1values()' outside of 'viewDidLoad()', but I get the exact same error.


Solution

  • This should work as you need. You need to add the view as a subview first before you set its constraints. I've added a clear example below.

    You should also set the translatesAutoresizingMaskIntoConstraints property on the label this means the system won't create a set of constraints that duplicate the behaviour specified by the view’s autoresizing mask.

    private let label = UILabel(frame: CGRect())
    
    override func viewDidLoad() {
        view.backgroundColor = .blue
    
        setUp(label: label)
        view.addSubview(label)
    
        setUpConstraints()
    }
    
    private func setUp(label: UILabel) {
        label.translatesAutoresizingMaskIntoConstraints = false
    }
    
    private func setUpConstraints() {
        NSLayoutConstraint.activate([
            label.topAnchor.constraint(equalTo: view.topAnchor),
            label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8),
            label.trailingAnchor(equalTo: view.trailingAnchor, constant: -8),
            label.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])
    }