Search code examples
iosnslayoutconstraintprogrammatically-created

How to add NSLayoutConstraints Programmatically


I want to add a button as subview of root view. Button must be place horizontally at centre as well as vertically at centre of superview. I'm using NSLayoutConstraints programatically. This is my code.

class ViewController: UIViewController {

    var button: UIButton!

    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
        button = UIButton()
        button.setTitle("Hello World", forState: .Normal)
        button.backgroundColor = UIColor.blueColor()
        button.sizeToFit()
        self.view.addSubview(button)
        NSLayoutConstraint.activateConstraints([
            NSLayoutConstraint(item: button, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0),
            NSLayoutConstraint(item: button, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 0)
        ])
    }
}

I'm getting following warning message, also I didn't get desired results.

2016-07-20 11:01:10.187 build[26982:309535] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.

Try this:

(1) look at each constraint and try to figure out which you don't expect;

(2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", " (Names: '|':UIViewControllerWrapperView:0x7faa4be31770 )>", "" )

Will attempt to recover by breaking constraint

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in may also be helpful. 2016-07-20 11:01:10.188 build[26982:309535] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.

Try this: (1) look at each constraint and try to figure out which you don't expect;

(2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "", " (Names: '|':UIViewControllerWrapperView:0x7faa4be31770 )>" )

Will attempt to recover by breaking constraint

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in may also be helpful.


Solution

  • NSLayoutConstraint is one of the way is used to add autolayout constraints dynamically.

    let new_view:UIView! = UIView(frame: CGRectMake(20, 20, 100, 100));
    new_view.backgroundColor = UIColor.redColor();
    new_view.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(new_view);
    NSLayoutConstraint(item: new_view,
            attribute: .Leading,
            relatedBy: .Equal,
            toItem: view,
            attribute: .LeadingMargin,
            multiplier: 1.0,
            constant: 0.0).active = true
    NSLayoutConstraint(item: new_view,
            attribute: .Top,
            relatedBy: .Equal,
            toItem: view,
            attribute: .TopMargin,
            multiplier: 1.0,
            constant: 20.0).active = true
    NSLayoutConstraint(item: new_view,
            attribute: .Height,
            relatedBy: .Equal,
            toItem: new_view,
            attribute:.Width,
            multiplier: 2.0,
            constant:0.0).active = true
    NSLayoutConstraint(item: new_view,
            attribute: .Width,
            relatedBy: .Equal,
            toItem: nil,
            attribute: .NotAnAttribute,
            multiplier: 1.0,
            constant: 100.0).active = true
    

    set translatesAutoresizingMaskIntoConstraints to false and call layoutifneeded method.