故事板“容器视图”只是一个标准UIView
目的。没有特殊的“容器视图”类型。事实上,如果你查看视图层次结构,你可以发现“容器视图”是一个标准UIView
:
为了以编程方式实现这一点,您可以使用“视图控制器包含”:
- 通过调用实例化子视图控制器
instantiateViewController(withIdentifier:)
在故事板对象上。
- Call
addChild
在你的父视图控制器中。
- 添加视图控制器的
view
到你的视图层次结构addSubview
(并且还设置frame
或适当的限制)。
- 致电
didMove(toParent:)
子视图控制器上的方法,将引用传递给父视图控制器。
See 实现容器视图控制器 https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/uid/TP40007457-CH11-SW1 in the 查看控制器编程指南以及“实现容器视图控制器”部分UIViewController 类参考 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class.
例如,在 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
to false
自己定义约束。你显然可以离开translatesAutosizingMaskIntoConstraints
as true
并设置frame
和autosizingMask https://developer.apple.com/documentation/uikit/uiview/1622559-autoresizingmask如果您愿意,可以查看您添加的视图。
请参阅此答案的先前修订版Swift 3 https://stackoverflow.com/revisions/37370856/9 and Swift 2 https://stackoverflow.com/revisions/37370856/7演绎。