2015-03-04 12 views
15

Mam containerView z pełnym ekranie wewnątrz VC. Jeśli dodać dziecko do containerView ręcznie z ujęć robi segue osadzenia wygląda dobrze: enter image description hereŁadowanie ViewController wewnątrz widoku kontenera

Ale ja osadzić VC kodem:

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

otrzymuję bardzo dziwne wyniki: enter image description here

Odpowiedz

50

Musisz poinformować kontroler widoku BannerContainer, że ma on nowy kontroler podrzędny, i powiedzieć dziecku, że ma nadrzędny znak VC. Jest to opisane w Apple Docs here. Tak:

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

Albo w 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) 

Gwarantuje to, że różne metody układ i dotykowe są przepuszczane przez dziecku VC; Podejrzewam, że problemy z układem, które masz, mogą wynikać z tych metod, które nie są obecnie wywoływane.

+0

Rzeczywiście rozwiązuje moje problemy z ograniczeniem widoku chield –

+0

Jak usunąć viewController z containerView w szybki? ponieważ Po dodaniu obiektu viewController, a następnie innego, pierwszy jest nadal osadzony? –

+0

Zobacz "Usuwanie kontrolera widoku dziecka" w odsyłaczu osadzonym w mojej odpowiedzi. Zasadniczo wystarczy odwrócić proces: wywołaj "willMoveToParentViewController" na elemencie potomnym, usuń widok, a następnie wywołaj metodę 'removeFromParentViewController'. @AymenBRomdhane – pbasdf

6

Próbowałem użyć powyższej odpowiedzi, ale się okazuje, że CGRectMake nie jest już dostępny.

Aktualizacja dla 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) 
+0

i vc.didMoveToParentViewController (self) jest teraz vc.didMove (toParentViewController: self) –

+0

@LuizDias Czy pozwala to na dynamiczną wysokość widoku kontenera? – ethanfox27

+0

Tak, @ ethanfox27. Ale musisz podać poprawne rozmiary klatek w 'self.container.frame.size.width' i' self.container.frame.size.height' –

-2

Aktualizacja dla 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)