Eine Storyboard- "Containeransicht" ist nur ein Standardobjekt UIView
. Es gibt keinen speziellen Typ "Containeransicht". Wenn Sie sich die Ansichtshierarchie ansehen, sehen Sie, dass die "Containeransicht" ein Standard ist UIView
:
Um dies programmgesteuert zu erreichen, verwenden Sie "View Controller Containment":
- Instanziieren Sie den untergeordneten Ansichtscontroller, indem Sie
instantiateViewController(withIdentifier:)
das Storyboard-Objekt aufrufen .
- Rufen Sie
addChild
Ihren übergeordneten View Controller auf.
- Fügen Sie die Ansichts-Controller
view
zu Ihrer Ansichtshierarchie hinzu addSubview
(und legen Sie die frame
oder Einschränkungen entsprechend fest).
- Rufen Sie die
didMove(toParent:)
Methode auf dem untergeordneten Ansichtscontroller auf und übergeben Sie den Verweis an den übergeordneten Ansichtscontroller.
Siehe Implementieren eines Container View Controllers im View Controller-Programmierhandbuch und im Abschnitt "Implementieren eines Container View Controllers" der UIViewController-Klassenreferenz .
In Swift 4.2 könnte es beispielsweise so aussehen:
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)
}
Beachten Sie, dass oben keine "Containeransicht" zur Hierarchie hinzugefügt wird. Wenn Sie das tun möchten, würden Sie etwas tun wie:
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)
}
Dieses letztere Muster ist äußerst nützlich, wenn Sie jemals zwischen verschiedenen untergeordneten Ansichtscontrollern wechseln und nur sicherstellen möchten, dass sich die Ansicht eines Kindes am selben Speicherort befindet und die Ansicht des vorherigen Kindes (dh alle eindeutigen Einschränkungen für die Platzierung werden von der Containeransicht vorgegeben). anstatt diese Einschränkungen jedes Mal neu erstellen zu müssen). Wenn Sie jedoch nur eine einfache Ansichtsbegrenzung durchführen, ist die Notwendigkeit dieser separaten Containeransicht weniger zwingend.
In den obigen Beispielen, Ich gründe translatesAutosizingMaskIntoConstraints
auf false
die Zwänge selbst zu definieren. Sie können offensichtlich verlassen translatesAutosizingMaskIntoConstraints
wie true
und hier sowohl die frame
und die autosizingMask
für die Ansichten , die Sie hinzufügen möchten , wenn Sie bevorzugen würden.
Siehe frühere Überarbeitungen dieser Antwort für Swift 3- und Swift 2- Wiedergaben.