"Перегляд контейнерів" для розкадровки - це лише стандартний 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 .