IOS Swift NSLayoutConstraint。无法设置水平居中的视图

IOS Swift NSLayoutConstraint. Unable to setup views horizontally centered

我正在尝试将所有视图水平居中,垂直间距为 40。显示电子邮件和密码字段。但是登录和注册按钮根本不显示。

    view.addSubview(emailidTextField)
    view.addSubview(passwordTextField)
    view.addSubview(loginButton)
    view.addSubview(signupButton)

    passwordTextField.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    passwordTextField.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    emailidTextField.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    emailidTextField.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))


    loginButton.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    loginButton.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    signupButton.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    signupButton.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    view.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.CenterXWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterXWithinMargins, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.CenterYWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterYWithinMargins, multiplier: 1, constant: 0))

    view.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.CenterXWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterXWithinMargins, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: passwordTextField, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: -10))

    view.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: passwordTextField, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 40))

    view.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: loginButton, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 40))

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7989a9e0 UIButton:0x79990040'Signup'.centerX == UIView:0x79c87d70.centerX>

我已将密码字段水平和垂直居中。然后将其用作 space 其他垂直视图的参考。关于我做错了什么的任何指示?

你的约束工作正常,我在我的代码中尝试了同样的方法,它按你期望的那样工作,只是我添加了一些属性来展示按钮和文本字段,

修改后的约束代码如下,

让 emailidTextField = UITextField() emailidTextField.borderStyle = UITextBorderStyle.Line emailidTextField.translatesAutoresizingMaskIntoConstraints = 假 emailidTextField.placeholder = "Email Id"

    let passwordTextField = UITextField()
    passwordTextField.borderStyle = UITextBorderStyle.Line
    passwordTextField.translatesAutoresizingMaskIntoConstraints = false
    passwordTextField.placeholder = "Password"

    let loginButton = UIButton(type: UIButtonType.System) as UIButton
    loginButton.translatesAutoresizingMaskIntoConstraints = false
    loginButton.setTitle("Login", forState: UIControlState.Normal)

    loginButton.titleLabel?.textColor = UIColor.blueColor()
    loginButton.backgroundColor = UIColor.lightGrayColor()

    let signupButton = UIButton(type: UIButtonType.System) as UIButton
    signupButton.translatesAutoresizingMaskIntoConstraints = false
    signupButton.setTitle("Sign Up", forState: UIControlState.Normal)
    loginButton.titleLabel?.textColor = UIColor.blueColor()
    signupButton.backgroundColor = UIColor.lightGrayColor()


    view.addSubview(emailidTextField)
    view.addSubview(passwordTextField)
    view.addSubview(loginButton)
    view.addSubview(signupButton)

    passwordTextField.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    passwordTextField.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    emailidTextField.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    emailidTextField.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))


    loginButton.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    loginButton.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    signupButton.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.view.frame.width - 20))
    signupButton.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40))

    view.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.CenterXWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterXWithinMargins, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: passwordTextField, attribute: NSLayoutAttribute.CenterYWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterYWithinMargins, multiplier: 1, constant: 0))

    view.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.CenterXWithinMargins, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterXWithinMargins, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: emailidTextField, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: passwordTextField, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: -10))

    view.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: loginButton, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: passwordTextField, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 40))

    view.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: signupButton, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: loginButton, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 40))