Una "visualizzazione contenitore" dello storyboard è solo un UIView
oggetto standard . Non esiste un tipo speciale di "visualizzazione contenitore". Infatti, se guardi la gerarchia delle viste, puoi vedere che la "vista contenitore" è uno standard UIView
:
Per ottenere questo risultato a livello di codice, utilizzi il "contenimento del controller di visualizzazione":
- Crea un'istanza del controller della visualizzazione figlio chiamando
instantiateViewController(withIdentifier:)
l'oggetto storyboard.
- Chiama
addChild
il controller della vista genitore.
- Aggiungi il controller di
view
visualizzazione alla gerarchia di visualizzazione con addSubview
(e imposta anche i frame
vincoli o come appropriato).
- Chiama il
didMove(toParent:)
metodo sul controller della vista figlio, passando il riferimento al controller della vista padre.
Vedere Implementazione di un controller di visualizzazione del contenitore nella Guida alla programmazione del controller di visualizzazione e la sezione "Implementazione di un controller di visualizzazione del contenitore" del riferimento alla classe UIViewController .
Ad esempio, in Swift 4.2 potrebbe apparire come:
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)
}
Nota, quanto sopra in realtà non aggiunge una "visualizzazione contenitore" alla gerarchia. Se vuoi farlo, faresti qualcosa come:
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)
}
Quest'ultimo modello è estremamente utile se si passa da un controller di visualizzazione figlio a un altro e si desidera solo assicurarsi che la visualizzazione di un bambino si trovi nella stessa posizione e la visualizzazione del bambino precedente (cioè tutti i vincoli unici per il posizionamento sono dettati dalla visualizzazione contenitore, piuttosto che dover ricostruire ogni volta questi vincoli). Ma se si esegue solo il contenimento della vista semplice, la necessità di questa vista contenitore separata è meno convincente.
Negli esempi precedenti, mi sto preparando translatesAutosizingMaskIntoConstraints
a false
definire i vincoli da solo. Ovviamente puoi lasciare translatesAutosizingMaskIntoConstraints
come true
e impostare sia il frame
che il autosizingMask
per le visualizzazioni che aggiungi, se preferisci.
Vedi le revisioni precedenti di questa risposta per le versioni di Swift 3 e Swift 2 .