web-dev-qa-db-fra.com

Chargement d'un ViewController dans une vue de conteneur

J'ai un containerView avec plein écran à l'intérieur d'un VC. Si j'ajoute un enfant au conteneur, visualisez-le manuellement à partir d'un Storyboard faisant une séquence intégrée:enter image description here

Mais si j'incorpore le VC par 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)
    }
}

J'obtiens des résultats super étranges: 

enter image description here

18
Godfather

Vous devez indiquer à votre contrôleur de vue BannerContainer qu'il dispose d'un nouveau contrôleur enfant et indiquer à l'enfant qu'il a un VC parent. Ceci est décrit dans les documents Apple ici . Comme ça:

   [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];

Ou à 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)

Cela garantit que diverses méthodes de présentation et tactiles sont transmises au VC enfant; Je suppose que les problèmes de mise en page que vous avez rencontrés sont peut-être dus au fait que ces méthodes ne sont pas appelées actuellement.

55
pbasdf

J'ai essayé d'utiliser la réponse ci-dessus, mais il s'avère que CGRectMake n'est plus disponible.

Mis à jour pour 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)
7
Luiz Dias

Il suffit d'appeler cette fonction: - 

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)
 }
0
DEEPAK KUMAR