Search code examples
iosswiftuiviewautolayoutnslayoutconstraint

applying constraints to facebook login button


I'm trying to add constraints to facebook button to make it at the button, here is my code;

...
let loginButton = FBSDKLoginButton()
loginButton.readPermissions = ["public_profile", "email"]
loginButton.center = self.view.center

let myConstraint =
NSLayoutConstraint(item: loginButton,
        attribute: NSLayoutAttribute.Bottom,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.view,
        attribute: NSLayoutAttribute.Bottom,
        multiplier: 1.0,
        constant: -20)
    self.view.addConstraint(myConstraint)

loginButton.addConstraint(myConstraint)

loginButton.delegate = self
self.view.addSubview(loginButton)

it fails with error below;

The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x15fd258a0 FBSDKLoginButton:0x15fe562d0'Log in'.bottom == UIView:0x15fd2fa60.bottom - 20>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug.

Any idea?


Solution

  • The error tells you that you add the constraint too early. You should first add the loginButton and only after that add the constraints:

    loginButton.delegate = self
    
    self.view.addSubview(loginButton)
    self.view.addConstraint(myConstraint)
    loginButton.addConstraint(myConstraint)
    

    The error message mentions When added to a view, the constraint's items must be descendants of that view. But you add the constraint of the loginButton before the actual button is added to the view.