Uma "visualização de contêiner" de storyboard é apenas um UIView
objeto padrão . Não existe um tipo especial de "visualização de contêiner". Na verdade, se você olhar para a hierarquia de visualizações, verá que a "visualização do contêiner" é um padrão UIView
:
Para conseguir isso de forma programática, você emprega "visualizar contenção do controlador":
- Instancie o controlador de visualização filho chamando
instantiateViewController(withIdentifier:)
o objeto storyboard.
- Chame
addChild
seu controlador de visualização pai.
- Adicione o controlador de visualização
view
à sua hierarquia de visualização com addSubview
(e também defina as frame
restrições ou conforme apropriado).
- Chame o
didMove(toParent:)
método no controlador de visualização filho, passando a referência para o controlador de visualização pai.
Consulte Implementing a Container View Controller no View Controller Programming Guide e a seção "Implementing a Container View Controller" da Referência de classe UIViewController .
Por exemplo, no Swift 4.2 pode ser parecido com:
override func viewDidLoad() {
super.viewDidLoad()
let controller = storyboard!.instantiateViewController(withIdentifier: "Second")
addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(controller.view)
NSLayoutConstraint.activate([
controller.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
controller.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
controller.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
controller.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10)
])
controller.didMove(toParent: self)
}
Observe que o acima não adiciona realmente uma "visualização de contêiner" à hierarquia. Se você quiser fazer isso, você faria algo como:
override func viewDidLoad() {
super.viewDidLoad()
// add container
let containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(containerView)
NSLayoutConstraint.activate([
containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
containerView.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10),
])
// add child view controller view to container
let controller = storyboard!.instantiateViewController(withIdentifier: "Second")
addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(controller.view)
NSLayoutConstraint.activate([
controller.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
controller.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
controller.view.topAnchor.constraint(equalTo: containerView.topAnchor),
controller.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)
])
controller.didMove(toParent: self)
}
Este último padrão é extremamente útil se alguma vez fizer a transição entre diferentes controladores de visualização filho e você só quiser ter certeza de que a visualização de um filho está no mesmo local e a visualização do filho anterior (ou seja, todas as restrições exclusivas para a colocação são ditadas pela visualização do contêiner, em vez de precisar reconstruir essas restrições todas as vezes). Mas se apenas executar a contenção de visualização simples, a necessidade dessa visualização de contêiner separada é menos atraente.
Nos exemplos acima, eu estou definindo translatesAutosizingMaskIntoConstraints
para false
definir as restrições de mim mesmo. Você, obviamente, pode deixar translatesAutosizingMaskIntoConstraints
como true
e definir tanto o frame
eo autosizingMask
para os pontos de vista que você adicionar, se você preferir.
Veja as revisões anteriores desta resposta para versões de Swift 3 e Swift 2 .