如何以编程方式添加 NSLayoutConstraints

How to add NSLayoutConstraints Programmatically

我想添加一个按钮作为根视图的子视图。按钮必须水平放置在父视图的中心,垂直放置在父视图的中心。我正在以编程方式使用 NSLayoutConstraints。这是我的代码。

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)
        ])
    }
}

我收到以下警告消息,而且我没有得到想要的结果。

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.

NSLayoutConstraint 是用于动态添加自动布局约束的方法之一。

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

translatesAutoresizingMaskIntoConstraints设置为false并调用layoutifneeded方法。