Una "vista de contenedor" del guión gráfico es solo un UIView
objeto estándar . No hay un tipo especial de "vista de contenedor". De hecho, si observa la jerarquía de vistas, puede ver que la "vista de contenedor" es un estándar UIView
:
Para lograr esto de manera programática, emplea "contención del controlador de vista":
- Cree una instancia del controlador de vista infantil llamando
instantiateViewController(withIdentifier:)
al objeto del guión gráfico.
- Llame
addChild
a su controlador de vista de padres.
- Agregue el controlador de vista
view
a su jerarquía de vista con addSubview
(y también establezca las frame
restricciones o según corresponda).
- Llame al
didMove(toParent:)
método en el controlador de vista secundario, pasando la referencia al controlador de vista principal.
Consulte Implementación de un controlador de vista de contenedor en la Guía de programación del controlador de vista y la sección "Implementación de un controlador de vista de contenedor" de la Referencia de clase de UIViewController .
Por ejemplo, en Swift 4.2 podría verse así:
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)
}
Tenga en cuenta que lo anterior en realidad no agrega una "vista de contenedor" a la jerarquía. Si quieres hacer eso, harías 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 patrón es extremadamente útil si alguna vez se realiza la transición entre diferentes controladores de vista infantil y solo desea asegurarse de que la vista de un niño esté en la misma ubicación y la vista del niño anterior (es decir, todas las restricciones únicas para la ubicación están dictadas por la vista del contenedor, en lugar de tener que reconstruir estas limitaciones cada vez). Pero si solo realiza una contención de vista simple, la necesidad de esta vista de contenedor separada es menos convincente.
En los ejemplos anteriores, me estoy configurando translatesAutosizingMaskIntoConstraints
para false
definir las restricciones yo mismo. Obviamente, puede dejar translatesAutosizingMaskIntoConstraints
como true
y establecer tanto el frame
como el autosizingMask
para las vistas que agregue, si lo prefiere.
Consulte las revisiones anteriores de esta respuesta para las versiones de Swift 3 y Swift 2 .