«Контейнерное представление» раскадровки - это просто стандартный UIView
объект. Специального типа "контейнерный вид" нет. Фактически, если вы посмотрите на иерархию представлений, вы увидите, что «контейнерное представление» является стандартом UIView
:
Чтобы достичь этого программно, вы используете «сдерживание контроллера представления»:
- Создайте экземпляр дочернего контроллера представления, вызвав
instantiateViewController(withIdentifier:)
объект раскадровки.
- Вызовите
addChild
свой родительский контроллер представления.
- Добавьте контроллер представления
view
в иерархию представления с помощью addSubview
(а также установите соответствующие frame
ограничения или).
- Вызовите
didMove(toParent:)
метод на контроллере дочернего представления, передав ссылку на контроллер родительского представления.
См. Раздел « Реализация контроллера представления контейнера» в Руководстве по программированию контроллера представления. и раздел «Реализация контроллера представления контейнера» справочника по классам UIViewController .
Например, в Swift 4.2 это может выглядеть так:
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)
}
Обратите внимание, что приведенное выше на самом деле не добавляет к иерархии «представление контейнера». Если вы хотите это сделать, сделайте что-то вроде:
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)
}
Этот последний шаблон чрезвычайно полезен при переходе между различными контроллерами дочерних представлений, и вы просто хотите убедиться, что одно дочернее представление находится в том же месте, что и предыдущее дочернее представление (т.е. все уникальные ограничения для размещения продиктованы представлением контейнера, вместо того, чтобы каждый раз перестраивать эти ограничения). Но если просто выполнить простое включение представления, потребность в этом отдельном представлении контейнера будет менее острой.
В приведенных выше примерах, я устанавливаю translatesAutosizingMaskIntoConstraints
для false
определения ограничений себя. Вы, очевидно, можете оставить translatesAutosizingMaskIntoConstraints
как true
и установить и frame
и autosizingMask
для добавляемых вами представлений, если хотите.
См. Предыдущие версии этого ответа для представлений Swift 3 и Swift 2 .