在没有情节提要的情况下以编程方式添加容器视图?

Posted

技术标签:

【中文标题】在没有情节提要的情况下以编程方式添加容器视图?【英文标题】:Adding a container view programmatically without storyboard? 【发布时间】:2016-08-13 19:58:22 【问题描述】:

我的viewDidLoad 中有这个:

    let childViewControllerForPosts = PostsCollectionViewController(collectionViewLayout: UICollectionViewLayout())
    let cView = childViewControllerForPosts.view
    self.view.backgroundColor = UIColor.redColor()
    self.addChildViewController(childViewControllerForPosts)
    self.view.addSubview(cView)
    childViewControllerForPosts.didMoveToParentViewController(self)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(handleScroll(_:)), name: "cvScrolled", object: nil)

    cView.widthAnchor.constraintEqualToConstant(view.frame.size.width).active = true
    cView.heightAnchor.constraintEqualToConstant(view.frame.size.height).active = true
    cView.topAnchor.constraintEqualToAnchor(containerForGreyAndPurple.bottomAnchor).active = true
    cView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true

但是,我收到一条错误消息,指出这是一个非法约束,因为它没有共同的祖先 :(

这是错误:

...because they have no common ancestor. Does the constraint reference items in different view hierarchies? That's illegal.'

【问题讨论】:

【参考方案1】:

您设置的约束不正确。

您需要先为父视图和容器视图添加约束,然后您还需要向容器控制器添加约束。 最后你应该在设置所有约束的末尾添加 didMoveToParent。

示例如下,你可以在你的情况下做类似的事情。

   NSLayoutConstraint.activateConstraints([
        containerView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 10),
        containerView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant: -10),
        containerView.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 10),
        containerView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor, constant: -10),
    ])


  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)

Use autolayout to set dynamic UIView to match container view

【讨论】:

哦,我必须将控制器添加到 UIView?因为我在屏幕的上半部分添加了一个 UIView,然后我试图将控制器(容器)添加到底部。 No No.. 我给你的只是一个例子。你需要配置你的容器,架构类似,但你可以将它设置为不同的 UIViews。

以上是关于在没有情节提要的情况下以编程方式添加容器视图?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将视图添加到情节提要

以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]

iOS:如何以编程方式将视图添加到情节提要视图

没有情节提要或图像的 iOS 启动图像

在没有任何情节提要参考的情况下在控制器之间传递数据

Swift:以编程方式添加视图时,UIScrollView 的可滚动内容大小不明确,而不使用 IB