【问题标题】:Adding Constraints to ViewController with Swift使用 Swift 向 ViewController 添加约束
【发布时间】:2017-08-16 09:58:15
【问题描述】:

我想将 container 视图添加到主视图 (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 (active)>

【问题讨论】:

  • 尝试将frame/Layout 分配给您的每个项目,例如 userIDLabel、passwordLabel 等...

标签: ios swift uiview autolayout constraints


【解决方案1】:

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

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

您不能在 container 上添加一个引用它的超级视图的约束。

并将setupLoginView() 移动到viewDidLoad 而不是init()

不要忘记删除控制台中的警告,以便为所有创建的视图(容器、标签、按钮和文本视图)将 translatesAutoresizingMaskIntoConstraints 设置为 false

【讨论】:

    【解决方案2】:

    1.将setupLoginView() 移动到viewDidLoad()

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

    2。设置translatesAutoresizingMaskIntoConstraintscontainer

        container.translatesAutoresizingMaskIntoConstraints = false
    

    3.将constraints 添加到相关的views

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

    【讨论】:

      【解决方案3】:

      ViewController 的视图还不存在。将setupLoginView() 调用从init() 方法移至viewDidLoad()

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

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

      【讨论】:

        【解决方案4】:

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

        然后,替换

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

        通过这个:

        override func viewDidLoad() {
            super.viewDidLoad()
        

        它应该可以工作。

        【讨论】:

          猜你喜欢
          • 2017-08-25
          • 1970-01-01
          • 2015-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-12
          • 2021-05-19
          • 1970-01-01
          相关资源
          最近更新 更多