Film şeridi "kapsayıcı görünümü" yalnızca standart bir UIView
nesnedir. Ö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
view
ile görünüm hiyerarşinize ekleyin addSubview
(ve ayrıca frame
veya 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 translatesAutosizingMaskIntoConstraints
için false
kısıtlamaları kendim tanımlayan. Belli ki bırakabilirsiniz translatesAutosizingMaskIntoConstraints
olarak true
ve her iki set frame
ve autosizingMask
dilerseniz ekleyebilir görünümleri için.
Swift 3 ve Swift 2 yorumlamaları için bu cevabın önceki revizyonlarına bakın .