容器视图可以通过界面编辑器轻松添加到故事板中.添加时,容器视图是占位符视图,嵌入段和(子)视图控制器.
但是,我无法找到一种以编程方式添加Container View的方法.其实我甚至不能找到一个名为UIContainerView的类.
容器视图类的名称肯定是一个好的开始.一个完整的指南,包括segue将不胜感激.
我知道View Controller编程指南,但我不认为它与Interface Builder对于Container Viewer的方式相同.例如,当约束被正确设置时,(子)视图将适应容器视图中的大小变化.
解决方法
故事板“容器视图”只是一个标准的UIView对象.没有特殊的“容器视图”类型.实际上,如果您查看视图层次结构,可以看到“容器视图”是标准的UIView:
为了以编程方式实现这一点,您使用“视图控制器控制”:
>通过在storyboard对象上调用instantiateViewControllerWithIdentifier实例化子视图控制器.
>在父视图控制器中调用addChildViewController.
>使用addSubview将视图控制器的视图添加到视图层次结构中(并根据需要设置框架或约束).
>在子视图控制器上调用didMoveToParentViewController方法,将引用传递给父视图控制器.
请参阅07控制器编程指南中的Implementing a Container View Controller和UIViewController Class Reference的“实现容器视图控制器”部分.
例如,它可能看起来像:
override func viewDidLoad() { super.viewDidLoad() let controller = storyboard!.instantiateViewControllerWithIdentifier("Second") addChildViewController(controller) controller.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(controller.view) NSLayoutConstraint.activateConstraints([ controller.view.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor,constant: 10),controller.view.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor,constant: -10),controller.view.topAnchor.constraintEqualToAnchor(view.topAnchor,controller.view.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor,constant: -10) ]) controller.didMoveToParentViewController(self) }
请注意,上述实际上并没有向层次结构添加“容器视图”.如果你想这样做,你会做一些像:
override func viewDidLoad() { super.viewDidLoad() // add container let containerView = UIView() containerView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(containerView) NSLayoutConstraint.activateConstraints([ containerView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor,containerView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor,containerView.topAnchor.constraintEqualToAnchor(view.topAnchor,containerView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor,]) // add child view controller view to container let controller = storyboard!.instantiateViewControllerWithIdentifier("Second") addChildViewController(controller) controller.view.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(controller.view) NSLayoutConstraint.activateConstraints([ controller.view.leadingAnchor.constraintEqualToAnchor(containerView.leadingAnchor),controller.view.trailingAnchor.constraintEqualToAnchor(containerView.trailingAnchor),controller.view.topAnchor.constraintEqualToAnchor(containerView.topAnchor),controller.view.bottomAnchor.constraintEqualToAnchor(containerView.bottomAnchor) ]) controller.didMoveToParentViewController(self) }
后一种模式非常有用,如果在不同子视图控制器之间进行转换,并且您只想确保一个孩子的视图位于同一位置,并且之前的子视图(即所有唯一的位置约束都由容器视图指定,而不是每次都需要重建这些约束).但是,如果只是执行简单的视图控制,则对这个单独的容器视图的需求不那么引人注目.