如何以编程方式添加NSLayoutConstraints

时间:2016-07-20 05:58:48

标签: ios nslayoutconstraint programmatically-created

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

import UIKit

class ViewController: UIViewController {

    var button : UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    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]无法同时满足约束条件。     可能至少以下列表中的一个约束是您不想要的约束。

试试这个:

(1)看看每个约束,并试图找出你不期望的;

(2)找到添加了不需要的约束或约束的代码并修复它。     (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) (     "&#34 ;,     "&#34 ;,     "&#34 ;,     "" )

将尝试通过违反约束来恢复

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2016-07-20 11:01:10.188 build [26982:309535]无法同时满足约束条件。     可能至少以下列表中的一个约束是您不想要的约束。

试试这个:

(1)查看每个约束并尝试找出你不期望的内容;

(2)找到添加了不需要的约束或约束的代码并修复它。     (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) (     "&#34 ;,     "&#34 ;,     "&#34 ;,     "" )

将尝试通过违反约束来恢复

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。 UIView中列出的UIVonstraintBasedLayoutDebugging类别中的方法也可能有所帮助。

1 个答案:

答案 0 :(得分:8)

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方法。