Sebuah "tampilan kontainer" storyboard hanyalah UIView
objek standar . Tidak ada jenis "tampilan penampung" khusus. Faktanya, jika Anda melihat hierarki tampilan, Anda dapat melihat bahwa "tampilan penampung" adalah standar UIView
:
Untuk mencapai ini secara terprogram, Anda menggunakan "penahanan pengontrol tampilan":
- Buat
instantiateViewController(withIdentifier:)
instance pengontrol tampilan anak dengan memanggil objek storyboard.
- Panggil
addChild
pengontrol tampilan orang tua Anda.
- Tambahkan pengontrol tampilan
view
ke hierarki tampilan Anda dengan addSubview
(dan juga setel frame
batasan atau yang sesuai).
- Panggil
didMove(toParent:)
metode pada pengontrol tampilan anak, dengan meneruskan referensi ke pengontrol tampilan induk.
Lihat Menerapkan Pengontrol Tampilan Penampung di Panduan Pemrograman Pengontrol Tampilan dan bagian "Menerapkan Pengontrol Tampilan Penampung" dari Referensi Kelas UIViewController .
Misalnya, di Swift 4.2 akan terlihat seperti ini:
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)
}
Perhatikan, hal di atas sebenarnya tidak menambahkan "tampilan container" ke hierarki. Jika Anda ingin melakukan itu, Anda akan melakukan sesuatu seperti:
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)
}
Pola terakhir ini sangat berguna jika pernah bertransisi antara pengontrol tampilan anak yang berbeda dan Anda hanya ingin memastikan tampilan satu anak berada di lokasi yang sama dan tampilan anak sebelumnya (yaitu semua batasan unik untuk penempatan ditentukan oleh tampilan penampung, daripada perlu membangun kembali batasan ini setiap saat). Namun jika hanya melakukan penahanan tampilan sederhana, kebutuhan akan tampilan penampung terpisah ini kurang menarik.
Dalam contoh di atas, saya menetapkan sendiri translatesAutosizingMaskIntoConstraints
untuk false
menentukan batasan. Anda jelas dapat meninggalkan translatesAutosizingMaskIntoConstraints
sebagai true
dan menyetel frame
dan autosizingMask
untuk tampilan yang Anda tambahkan, jika Anda mau.
Lihat revisi sebelumnya dari jawaban ini untuk membawakan Swift 3 dan Swift 2 .