"Chế độ xem vùng chứa" trong bảng phân cảnh chỉ là một UIView
đối tượng tiêu chuẩn . Không có kiểu "chế độ xem vùng chứa" đặc biệt. Trên thực tế, nếu bạn nhìn vào phân cấp chế độ xem, bạn có thể thấy rằng "chế độ xem vùng chứa" là một tiêu chuẩn UIView
:
Để đạt được điều này theo chương trình, bạn sử dụng "chức năng ngăn bộ điều khiển chế độ xem":
- Khởi tạo bộ điều khiển chế độ xem trẻ em bằng cách gọi
instantiateViewController(withIdentifier:)
đối tượng bảng phân cảnh.
- Gọi
addChild
trong bộ điều khiển chế độ xem cha mẹ của bạn.
- Thêm bộ điều khiển
view
chế độ xem vào hệ thống phân cấp chế độ xem của bạn với addSubview
(và cũng đặtframe
hoặc các ràng buộc nếu thích hợp).
- Gọi
didMove(toParent:)
phương thức trên bộ điều khiển chế độ xem con, chuyển tham chiếu đến bộ điều khiển chế độ xem mẹ.
Xem Triển khai bộ điều khiển dạng xem vùng chứa trong Hướng dẫn lập trình bộ điều khiển dạng xem và phần "Triển khai bộ điều khiển dạng xem vùng chứa" của Tham chiếu lớp UIViewController .
Ví dụ, trong Swift 4.2, nó có thể giống như sau:
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)
}
Lưu ý, phần trên không thực sự thêm "chế độ xem vùng chứa" vào hệ thống phân cấp. Nếu bạn muốn làm điều đó, bạn phải làm điều gì đó như:
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)
}
Mẫu thứ hai này cực kỳ hữu ích nếu bạn từng chuyển đổi giữa các bộ điều khiển chế độ xem trẻ em khác nhau và bạn chỉ muốn đảm bảo chế độ xem của một đứa trẻ ở cùng một vị trí và chế độ xem của đứa trẻ trước đó (nghĩa là tất cả các ràng buộc duy nhất cho vị trí được quy định bởi chế độ xem vùng chứa, thay vì cần phải xây dựng lại các ràng buộc này mỗi lần). Nhưng nếu chỉ thực hiện ngăn chế độ xem đơn giản, nhu cầu về chế độ xem vùng chứa riêng biệt này sẽ kém hấp dẫn hơn.
Trong các ví dụ trên, tôi đang thiết lập translatesAutosizingMaskIntoConstraints
để tự false
xác định các ràng buộc. Bạn rõ ràng là có thể để lại translatesAutosizingMaskIntoConstraints
như true
và đặt cả frame
và autosizingMask
cho quan điểm bạn thêm, nếu bạn muốn.
Xem các bản sửa đổi trước của câu trả lời này cho các phiên bản Swift 3 và Swift 2 .