Загрузка ViewController внутри контейнера

У меня есть ContainerView с полным экраном внутри ВК. Если я добавляю дочерний элемент в containerView вручную из раскадровки, выполнение перехода встраивания выглядит нормально: enter image description here

Но если я вставлю ВК по коду:

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

Я получаю супер странные результаты:

enter image description here

Ответы

Ответ 1

Вам нужно сообщить контроллеру вида BannerContainer, что у него есть новый дочерний контроллер, и сообщить ребенку, что он имеет родительский VC. Это описано в Документах Apple здесь. Вот так:

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

Или в 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)

Это гарантирует, что различные макеты и методы касания передаются дочернему VC; Я подозреваю, что проблемы с макетом у вас могут быть вызваны теми методами, которые в настоящее время не вызываются.

Ответ 2

Пытался использовать ответ выше, но, оказывается, CGRectMake больше не доступен.

Обновлено для 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)

Ответ 3

Просто вызовите эту функцию:

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

Ответ 4

Обновление для 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 - это еще один встроенный контроллер представления.

Ответ 5

Обновлено для 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)