我有一个名为loginView
的子视图,其中包含一些其他元素,即loginButton
和loginUsername
我正在尝试以编程方式添加一个Facebook登录按钮,该按钮具有相对于loginButton
,loginView
和loginUsername
这是我的代码
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:]进行调试。
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
错误说明了所有。在添加约束之前,您需要准备所有视图到层次结构。在添加约束之前检查是否所有四个视图都添加到视图层次结构中(对于某些视图,您是否忘记了addSubvew
?)。 请勿将此代码移至viewWillLayoutSubviews
方法,这是错误的提示!因为您不想多次添加约束。此外,您应添加facebookLoginButtonWidthConstraint
以查看拥有(loginView
?),facebookLoginButton
和loginUsername
两者的内容,因为这是共享约束