Загрузка 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)