无法以编程方式向按钮添加约束 - Swift 2.0

时间:2016-06-09 06:30:30

标签: ios swift facebook nslayoutconstraint

我有一个名为loginView的子视图,其中包含一些其他元素,即loginButtonloginUsername

我正在尝试以编程方式添加一个Facebook登录按钮,该按钮具有相对于loginButtonloginViewloginUsername

的约束

这是我的代码

self.loginView.addSubview(facebookLoginButton)

let facebookLoginButtonTopConstraint = NSLayoutConstraint(
      item: facebookLoginButton, 
      attribute: NSLayoutAttribute.Top, 
      relatedBy: NSLayoutRelation.Equal, 
      toItem: loginButton, 
      attribute: NSLayoutAttribute.Bottom, 
      multiplier: 1, 
      constant: 8
)

let facebookLoginButtonLeadingConstraint = NSLayoutConstraint(
      item: facebookLoginButton, 
      attribute: NSLayoutAttribute.Leading, 
      relatedBy: NSLayoutRelation.Equal, 
      toItem: loginView, 
      attribute: NSLayoutAttribute.Leading, 
      multiplier: 1, 
      constant: 8
)

let facebookLoginButtonWidthConstraint = NSLayoutConstraint(
      item: facebookLoginButton, 
      attribute: NSLayoutAttribute.Width, 
      relatedBy: NSLayoutRelation.Equal, 
      toItem: loginUsername, 
      attribute: NSLayoutAttribute.Width, 
      multiplier: 1, 
      constant: 0
)

self.loginView.addConstraints([
      facebookLoginButtonTopConstraint, 
      facebookLoginButtonLeadingConstraint
])
self.facebookLoginButton.addConstraint(facebookLoginButtonWidthConstraint)

此代码将在我的viewDidLoad方法中进行。我得到的错误是:

未为约束准备视图层次结构:     添加到视图时,约束的项必须是该视图的后代(或视图本身)。如果在组装视图层次结构之前需要解析约束,则会崩溃。打破 - [UIView(UIConstraintBasedLayout)_viewHierarchyUnpreparedForConstraint:]进行调试。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

错误说明了所有。在添加约束之前,您需要准备所有视图到层次结构。在添加约束之前检查是否所有四个视图都添加到视图层次结构中(对于某些视图,您是否忘记了addSubvew?)。 请勿将此代码移至viewWillLayoutSubviews方法,这是错误的提示!因为您不想多次添加约束。此外,您应添加facebookLoginButtonWidthConstraint以查看拥有(loginView?),facebookLoginButtonloginUsername两者的内容,因为这是共享约束