如何以编程方式使用容器视图

How to use container view programmatically

我创建了一个 ViewController,我想在我的 ViewController 中添加一个容器视图,这里我在我的 ViewController:

中设置容器视图
var containerView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .red
    return view
}()

func setUpViews() {
    view.addSubview(containerView)
    containerView.heightAnchor.constraint(equalToConstant: 300).isActive = true
    containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    containerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    containerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
}

在这里,我在 containerView 中设置了我的 SecondViewController 实例:

override func viewDidLoad() {
    super.viewDidLoad()

    setUpViews()

    let secondViewController = SecondViewController()

    secondViewController.willMove(toParent: self)

    containerView.addSubview(secondViewController.view)
    self.addChild(secondViewController)
    secondViewController.didMove(toParent: self)

}

在我的SecondViewController中,我声明了标签和视图,我将标签设置在视图的中心:

let label: UILabel = {
    let label = UILabel()
    label.text = "Hello!"
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(myView)
        myView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        myView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        myView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        myView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

        view.addSubview(label)
        label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

    }

这就是我在我的应用程序中看到的内容,但我看到灰色视图中心有一个标签。 它不像我那样工作,我不明白为什么。

您需要在加载的视图上设置框架 and/or 约束:

override func viewDidLoad() {
    super.viewDidLoad()

    setUpViews()

    let secondViewController = SecondViewController()

    secondViewController.willMove(toParent: self)

    containerView.addSubview(secondViewController.view)

    // set the frame
    secondViewController.view.frame = containerView.bounds

    // enable auto-sizing (for example, if the device is rotated)
    secondViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    self.addChild(secondViewController)
    secondViewController.didMove(toParent: self)

}