webentwicklung-frage-antwort-db.com.de

Laden eines ViewControllers in eine Containeransicht

Ich habe eine containerView mit Vollbild in einem VC. Wenn ich der containerView ein untergeordnetes Element manuell von einem Storyboard aus hinzufüge, sieht es gut aus: enter image description here

Aber wenn ich den VC per Code einbettet:

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)
    }
}

Ich bekomme super seltsame Ergebnisse: 

enter image description here

18
Godfather

Sie müssen Ihrem BannerContainer-View-Controller mitteilen, dass er einen neuen untergeordneten Controller hat, und dem Child mitteilen, dass er über einen übergeordneten VC verfügt. Dies ist in den Apple Docs hier beschrieben. So was:

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

Oder 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)

Dadurch wird sichergestellt, dass verschiedene Layout- und Berührungsmethoden an den untergeordneten VC weitergegeben werden. Ich vermute, dass die Layoutprobleme möglicherweise darauf zurückzuführen sind, dass diese Methoden derzeit nicht aufgerufen werden.

55
pbasdf

Versuchte, die Antwort oben zu verwenden, aber es stellte sich heraus, dass CGRectMake nicht mehr verfügbar ist.

Aktualisiert für 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

Update für 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 ist ein weiterer einzubettender View Controller.

Rufen Sie einfach diese Funktion auf: - 

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