在没有故事板的情况下以编程方式添加容器视图?
Adding a container view programmatically without storyboard?
我的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.'
您设置的约束不正确。
您需要先为父视图和容器视图添加约束,然后您还需要为容器控制器添加约束。
最后你应该在设置所有约束的最后添加 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
我的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.'
您设置的约束不正确。
您需要先为父视图和容器视图添加约束,然后您还需要为容器控制器添加约束。 最后你应该在设置所有约束的最后添加 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