สตอรีบอร์ด "มุมมองคอนเทนเนอร์" เป็นUIView
เพียงออบเจ็กต์มาตรฐาน ไม่มีประเภท "มุมมองคอนเทนเนอร์" พิเศษ ในความเป็นจริงหากคุณดูลำดับชั้นของมุมมองคุณจะเห็นว่า "มุมมองคอนเทนเนอร์" เป็นมาตรฐานUIView
:
เพื่อให้บรรลุเป้าหมายนี้โดยใช้โปรแกรมคุณใช้ "ดูการควบคุมตัวควบคุม":
- สร้างอินสแตนซ์ตัวควบคุมมุมมองเด็กโดยเรียก
instantiateViewController(withIdentifier:)
ใช้ออบเจ็กต์สตอรีบอร์ด
- โทร
addChild
ในตัวควบคุมมุมมองหลักของคุณ
- เพิ่มตัวควบคุม
view
มุมมองลงในลำดับชั้นมุมมองของคุณด้วยaddSubview
(และตั้งค่าframe
หรือข้อ จำกัด ตามความเหมาะสม)
- เรียกใช้
didMove(toParent:)
เมธอดบนตัวควบคุมมุมมองเด็กส่งการอ้างอิงไปยังตัวควบคุมมุมมองหลัก
ดูการนำตู้คอนเทนเนอร์ดูตัวควบคุมในมุมมองควบคุม Programming คู่มือและ "การนำตู้คอนเทนเนอร์ดูควบคุม" ของ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
สำหรับมุมมองที่คุณเพิ่มได้หากคุณต้องการ
ดูการแก้ไขก่อนหน้าของคำตอบนี้สำหรับสวิฟท์ 3และสวิฟท์ 2ซ้ำ