ストーリーボードの「コンテナビュー」は、単なる標準UIView
オブジェクトです。特別な「コンテナビュー」タイプはありません。実際、ビュー階層を見ると、「コンテナビュー」が標準であることがわかりますUIView
。
これをプログラムで実現するには、「ビューコントローラーコンテインメント」を使用します。
instantiateViewController(withIdentifier:)
ストーリーボードオブジェクトを呼び出して、子ビューコントローラをインスタンス化し ます。
addChild
親ビューコントローラーを呼び出します。
- を使用してビューコントローラー
view
をビュー階層に追加しますaddSubview
(また、frame
必要に応じてまたは制約を設定します)。
didMove(toParent:)
子ビューコントローラーでメソッドを呼び出し、参照を親ビューコントローラーに渡します。
参照してください。コンテナビューコントローラの実装にプログラミングガイド・ビュー・コントローラとのセクション「コンテナビューコントローラの実装」の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)
}
この後者のパターンは、異なる子ビューコントローラー間で遷移し、1つの子のビューが前の子のビューと同じ場所にあることを確認したい場合に非常に役立ちます(つまり、配置のすべての一意の制約はコンテナービューによって決まります)。毎回これらの制約を再構築する必要はありません)。ただし、単純なビューの封じ込めを実行するだけの場合、この個別のコンテナビューの必要性はそれほど魅力的ではありません。
上記の例では、自分で制約translatesAutosizingMaskIntoConstraints
をfalse
定義するように設定しています。あなたは明らかに残すことができますtranslatesAutosizingMaskIntoConstraints
ようtrue
、両方の設定frame
とautosizingMask
あなたが好む場合は、追加のビューのために。
Swift 3およびSwift 2レンディションについては、この回答の以前のリビジョンを参照してください。