简体   繁体   English

在容器视图中加载 ViewController

[英]Loading a ViewController inside a Container View

I have a containerView with full screen inside a VC.我在 VC 中有一个全屏的 containerView。 If i add a child to the containerView manually from a Storyboard doing a embed segue looks fine:如果我从 Storyboard 手动将一个孩子添加到 containerView 做一个嵌入 segue 看起来很好:在此处输入图片说明

But if I embed the VC by code:但是如果我通过代码嵌入 VC:

class BannerContainerVC: UIViewController {

    @IBOutlet weak var container: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let vc = storyboard?.instantiateViewControllerWithIdentifier("test") as UIViewController
        self.container.addSubview(vc.view)
    }
}

I get super strange results:我得到了超级奇怪的结果:

在此处输入图片说明

You need to tell your BannerContainer view controller that it has a new child controller, and to tell the Child that it has a parent VC.你需要告诉你的 BannerContainer 视图控制器它有一个新的子控制器,并告诉子它有一个父 VC。 This is described in the Apple Docs here .这在此处的 Apple 文档中有所描述。 Like this:像这样:

   [self addChildViewController:vc];
   vc.view.frame = CGRectMake(0, 0, self.container.frame.size.width, self.container.frame.size.height);
   [self.container addSubview:vc.view];
   [vc didMoveToParentViewController:self];

Or in Swift:或者在 Swift 中:

    self.addChildViewController(vc)
    vc.view.frame = CGRectMake(0, 0, self.container.frame.size.width, self.container.frame.size.height);
    self.container.addSubview(vc.view)
    vc.didMoveToParentViewController(self)

This ensures that various layout and touch methods are passed through to the child VC;这确保了将各种布局和触摸方法传递给子 VC; I suspect the layout problems you have may be due to those methods not currently being called.我怀疑您遇到的布局问题可能是由于当前未调用这些方法造成的。

Tried to use the answer above but it turns out CGRectMake isn't available anymore.尝试使用上面的答案,但事实证明CGRectMake不再可用。

Updated for Swift 3 :为 Swift 3 更新

self.addChildViewController(vc)
vc.view.frame = CGRect(x: 0, y: 0, width: self.container.frame.size.width, height: self.container.frame.size.height)
self.container.addSubview(vc.view)
vc.didMoveToParentViewController(self)

Update for Swift 4.2/5. Swift 4.2/5 的更新。

let listVc = ListViewController() 
listVc.view.frame = CGRect(x: 0, y: 0, width: self.listView.frame.width, height: self.listView.frame.height)
addChild(listVc)
listVc.didMove(toParent: self)

ListViewController is another view controller to be embedded. ListViewController 是另一个要嵌入的视图控制器。

Just call this function: -只需调用此函数:-

private func addChildView(viewController: UIViewController, in view: UIView) {
    viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    viewController.view.frame = view.bounds
    addChild(viewController)
    view.addSubview(viewController.view)
    viewController.didMove(toParent: self)
 }

Swift 5.0 Use this functions to add and remove child VC: Swift 5.0 使用此函数添加和删除子 VC:

private func add(asChildViewController viewController: UIViewController, childFrame:CGRect) {
        // Add Child View Controller
        addChild(viewController)

        // Add Child View as Subview
        view.addSubview(viewController.view)

        // Configure Child View
        viewController.view.frame = childFrame
        viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // Notify Child View Controller
        viewController.didMove(toParent: self)

    }
    private func remove(asChildViewController viewController: UIViewController) {
        // Notify Child View Controller
        viewController.willMove(toParent: nil)

        // Remove Child View From Superview
        viewController.view.removeFromSuperview()

        // Notify Child View Controller
        viewController.removeFromParent()
    }

adopted from here这里采用

Updated for Swift 4为 Swift 4 更新

self.addChildViewController(vc)
vc.view.frame = CGRect(x: 0, y: 0, width: self.container.frame.size.width, height: self.container.frame.size.height)
self.container.addSubview(vc.view)
vc.didMovestrong text(self)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM