2017-02-10 80 views
2

我试图让我的头以编程方式添加约束的作品。到目前为止,我有我的代码如下所示:以编程方式添加主要约束程序崩溃应用程序

import UIKit 

class ViewController: UIViewController { 

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

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


    func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     // I want to mimic a frame set of CGRect(x: 20, y: 50, width: 50, height: 50) 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 20) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     someView.addConstraints([widthConstraint, heightConstraint, leadingConstraint]) 
     view.addSubview(someView) 

    } 
} 

现在,当我运行的应用程序崩溃,因为领先的约束。错误消息是“不可能设置视图层次结构未准备好约束的布局”。我在这里做错了什么?我应该将约束添加到对象(本案例中的蓝色框)还是将它们添加到它的超视图?

编辑:

后更改代码,我有:

func addConstraintsView() { 
     let someView = UIView(frame: CGRect.zero) 
     someView.backgroundColor = UIColor.blue 
     view.addSubview(someView) 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 50) 
     let leadingConstraint = NSLayoutConstraint(item: someView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1.0, constant: 20) 
     someView.addConstraints([widthConstraint, heightConstraint]) 
     view.addConstraints([leadingConstraint]) 
    } 

回答

2

首先,

view.addSubview(someView) 
someView.translatesAutoresizingMaskIntoConstraints = false 

约束阶段之前要来。您必须在将someView添加到其超级视图后应用约束。

另外,如果你是针对iOS的9,我建议你使用布局锚状

let widthConstraint = someView.widthAnchor.constraint(equalToConstant: 50.0) 
let heightConstraint = someView.heightAnchor.constraint(equalToConstant: 50.0) 
let leadingConstraint = someView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0) 
NSLayoutConstraint.activate([widthConstraint, heightConstraint, leadingConstraint]) 

这样你就不必担心它查看该限制适用于。

最后(并清除您的疑问),如果您不能使用布局锚点,则应该将超前视图的前导约束添加到视图中。

+0

这有帮助。它正在工作!谢谢! – KexAri

+0

这是我的荣幸! –