Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loading a ViewController inside a Container View

Tags:

I have a containerView with full screen inside a VC. If i add a child to the containerView manually from a Storyboard doing a embed segue looks fine: enter image description here

But if I embed the VC by code:

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:

enter image description here

like image 564
Godfather Avatar asked Mar 04 '15 10:03

Godfather


2 Answers

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. This is described in the Apple Docs here. 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:

    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; I suspect the layout problems you have may be due to those methods not currently being called.

like image 186
pbasdf Avatar answered Nov 05 '22 21:11

pbasdf


Tried to use the answer above but it turns out CGRectMake isn't available anymore.

Updated for 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) 
like image 22
Luiz Dias Avatar answered Nov 05 '22 22:11

Luiz Dias