Film şeridi "kapsayıcı görünümü" yalnızca standart bir UIViewnesnedir. Özel bir "kapsayıcı görünümü" türü yoktur. Aslında, görünüm hiyerarşisine bakarsanız, "kapsayıcı görünümünün" bir standart olduğunu görebilirsiniz UIView:

Bunu programlı bir şekilde başarmak için, "denetleyici kapsamını görüntüle" yi kullanırsınız:
instantiateViewController(withIdentifier:)Film şeridi nesnesini çağırarak alt görünüm denetleyicisinin örneğini oluşturun .
addChildÜst görünüm denetleyicinizi arayın .
- Görünüm denetleyicilerini
viewile görünüm hiyerarşinize ekleyin addSubview(ve ayrıca frameveya kısıtlamalarını uygun şekilde ayarlayın).
- Başvuruyu
didMove(toParent:)üst görünüm denetleyicisine ileterek, alt görünüm denetleyicisindeki yöntemi çağırın .
Bkz Bir Konteyner View Controller uygulanması halinde Kılavuzu Programlama View Controller ve bölümüne "Bir Konteyner View Controller uygulanması" UIViewController Sınıf Referans .
Örneğin Swift 4.2'de şöyle görünebilir:
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)
}
Yukarıdakinin hiyerarşiye aslında bir "kapsayıcı görünümü" eklemediğini unutmayın. Bunu yapmak istiyorsan, şöyle bir şey yaparsın:
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)
}
Bu ikinci model, farklı çocuk görünümü denetleyicileri arasında geçiş yapılıyorsa ve yalnızca bir çocuğun görüşünün aynı konumda olduğundan ve önceki çocuğun görüşünde olduğundan emin olmak istiyorsanız son derece kullanışlıdır (yani, yerleştirme için tüm benzersiz kısıtlamalar kapsayıcı görünümü tarafından belirlenir, bu kısıtlamaları her seferinde yeniden oluşturmak yerine). Ancak, yalnızca basit görünüm sınırlaması gerçekleştiriyorsanız, bu ayrı konteyner görünümüne duyulan ihtiyaç daha az zorlayıcıdır.
Yukarıdaki örneklerde, ben ayarlıyorum translatesAutosizingMaskIntoConstraintsiçin falsekısıtlamaları kendim tanımlayan. Belli ki bırakabilirsiniz translatesAutosizingMaskIntoConstraintsolarak trueve her iki set frameve autosizingMaskdilerseniz ekleyebilir görünümleri için.
Swift 3 ve Swift 2 yorumlamaları için bu cevabın önceki revizyonlarına bakın .