使用Swift向ViewController添加约束

时间:2017-08-16 09:58:15

标签: ios swift uiview autolayout constraints

我想将容器视图添加到主视图( rootViewController.view ),但以下内容给出了异常。我知道约束,但无法找出原因。

import UIKit

class rootViewController : UIViewController {

    init() {
        super.init(nibName: nil, bundle: nil)
        setupLoginView()
    }

    func setupLoginView() {

        // User ID label
        let userIDLabel:UILabel = UILabel()
        userIDLabel.text = "User ID"

        // Password label
        let passwordLabel:UILabel = UILabel()
        passwordLabel.text = "Password"

        // User ID text
        let userIDText:UITextField = UITextField()

        // Password text
        let passwordText:UITextField = UITextField()

        // Login button
        let loginBtn:UIButton = UIButton()
        loginBtn.setTitle("Login", for: .normal)

        // Container view
        let container:UIView = UIView()

        container.addSubview(userIDLabel)
        container.addSubview(userIDText)
        container.addSubview(passwordLabel)
        container.addSubview(passwordText)
        container.addSubview(loginBtn)

        view.addSubview(container)

        // Add constraints
        let heightConstraint = NSLayoutConstraint(item: container, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 300)
        let widthConstraint = NSLayoutConstraint(item: container, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 200)
        let centerXConstraint = NSLayoutConstraint(item: container, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0)
        let centerYConstraint = NSLayoutConstraint(item: container, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0)

        container.addConstraint(heightConstraint)
        container.addConstraint(widthConstraint)
        container.addConstraint(centerXConstraint)
        container.addConstraint(centerYConstraint)

    }

}

提示以下异常,提示"约束是否引用了视图子树外部的内容?这是非法的"

  

' NSGenericException',原因:'无法在视图上安装约束。   约束是否引用了子树之外的内容   风景?这是非法的。约束:NSLayoutConstraint:0x170089830   UIView:0x12de138c0.centerX == UIView:0x12de0e650.centerX(有效)>

4 个答案:

答案 0 :(得分:1)

使用以下行替换代码以添加中心约束:

view.addConstraint(centerXConstraint)
view.addConstraint(centerYConstraint)

您无法在container上添加一个constaint,并引用它的超级视图。

setupLoginView()移至viewDidLoad而不是init()

请勿忘记在控制台中删除警告,以便为所有创建的视图(容器,标签,按钮和文本视图)设置translatesAutoresizingMaskIntoConstraintsfalse

答案 1 :(得分:1)

<强> 1。将setupLoginView()移至viewDidLoad()

override func viewDidLoad()
{
    super.viewDidLoad()
    setupLoginView()
}

<强> 2。设置translatesAutoresizingMaskIntoConstraints

container
    container.translatesAutoresizingMaskIntoConstraints = false

第3。将constraints添加到相关的views

    container.addConstraint(heightConstraint)
    container.addConstraint(widthConstraint)
    view.addConstraint(centerXConstraint)
    view.addConstraint(centerYConstraint)

答案 2 :(得分:0)

ViewController的视图尚不存在。将setupLoginView()来自init()方法的呼叫移至viewDidLoad()

另外 - 正如@Pranav Kasetti建议的那样 - 您必须将中心约束添加到view而不是container

最后但并非最不重要的是,为所有已创建的视图(包括translatesAutoresizingMaskIntoConstraints)将false设置为container

答案 3 :(得分:0)

问题是您在init方法中定义属性,但它不是ViewController的良好入口点。您应该take a look here了解一些细节。

然后,替换

init() {
    super.init(nibName: nil, bundle: nil)

由此:

override func viewDidLoad() {
    super.viewDidLoad()

它应该有用。