情节提要“容器视图”只是一个标准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)
}
如果要在不同的子视图控制器之间进行转换,并且您只想确保一个子视图与先前子视图位于同一位置,则后一种模式非常有用(即,所有唯一的放置约束均由容器视图决定,而不是每次都需要重建这些约束)。但是,如果仅执行简单的视图包含,则对这种单独的容器视图的需求就不那么吸引人了。
在上面的示例中,我将translatesAutosizingMaskIntoConstraints
自己false
定义约束。显然,你可以离开translatesAutosizingMaskIntoConstraints
的true
,并同时设置了frame
和autosizingMask
为您添加,如果你愿意的意见。
有关Swift 3和Swift 2演绎的信息,请参见此答案的先前版本。