以编程方式快速添加约束

我试图添加约束Facebook的SDKloginbutton。

我有滚动视图中的button,我想添加一个顶部的约束,也是在滚动视图中的标签。 我能够成功地添加高度约束没有运行时错误,但实际的约束似乎并没有被应用到button。

@IBOutlet weak var orLbl: UILabel! @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() var loginFBButton = FBSDKLoginButton() loginFBButton.readPermissions = ["public_profile", "email"] let heightConstraint = NSLayoutConstraint( item: loginFBButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 41) let topConstraint = NSLayoutConstraint( item: loginFBButton, attribute: NSLayoutAttribute.TopMargin, relatedBy: NSLayoutRelation.Equal, toItem: self.orLbl, attribute: NSLayoutAttribute.BottomMargin, multiplier: 1, constant: 31) let leadingConstraint = NSLayoutConstraint( item: loginFBButton, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.registerButton, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0) let trailingConstraint = NSLayoutConstraint( item: loginFBButton, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.registerButton, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0) self.scrollView.addSubview(loginFBButton) //loginFBButton.center = self.scrollView.center loginFBButton.addConstraints([heightConstraint, topConstraint]) } 

然后,当我包括顶部的约束,我得到一个运行时错误:

当添加到视图时,约束的项目必须是该视图的后代(或视图本身)。 如果在组装视图层次之前需要parsing约束,这将会崩溃。

终止应用程序由于未捕获的exception“NSGenericException”,原因:“无法安装约束的观点。 约束是否从视图的子树之外引用了某些东西? 这是非法的。

标签和Facebookbutton都在我的滚动视图中? 我甚至打印出orLbl.superview和loginFBButton.superview,我得到可选的uiscrollview两个

有一个新的(iOS8,OS 10.10),更容易的方式来激活约束,不涉及到哪些视图添加到。 约束已经知道它们属于哪个视图,所以首先确保你的视图已经被添加为子视图,然后在NSLayoutConstraint上调用类方法activateConstraints来激活它们:

  NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint]) 

当以编程方式创buildUI元素时,您需要告诉iOS不要将其框架变成约束。 要做到这一点,创buildloginFBButton之后:

对于Swift 1.2:

 loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false) 

对于Swift 2.0和3.0:

 loginFBButton.translatesAutoresizingMaskIntoConstraints = false 

最后,你将需要更多的限制。 我build议为你的loginFBButton设置一个宽度约束,并添加一个约束来水平地定位button。