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))
我正在尝试将所有视图水平居中,垂直间距为 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))