如何添加约束以将 tableview 固定到其父底部

Posted

技术标签:

【中文标题】如何添加约束以将 tableview 固定到其父底部【英文标题】:how to add a constrains to fix tableview to its parent bottom 【发布时间】:2017-11-13 14:16:24 【问题描述】:

我的视图中有一个容器,其中有两个 tableview 控制器作为子级。 我在课堂上有孩子作为这个属性

lazy var photoFeedVC: UserPicsTableViewController = self.makeAndAddVC()
    lazy var postFeedVC: PostFeedVC = self.makeAndAddVC()

生成孩子的功能

func makeAndAddVC<T: UIViewController>() -> T 
        let vc = T()
        self.addChildViewController(vc)
        return vc
    

在 viewDidAppear 中增加容器的大小后,我想将每个 tableview 固定到其容器底部。

photoFeedVC.tableView.snp.makeConstraints((make) -> Void in
        make.bottom.equalTo(containerView)
    )
    postFeedVC.tableView.snp.makeConstraints( make -> Void in
        make.bottom.equalTo(self.view)
    )

这是一个试图修复到底部的约束,但 xcode 给了我这个错误

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法使用锚激活约束 和 因为他们没有共同的祖先。约束或其 在不同的视图层次结构中锚定参考项目?那是 非法。'

这里增加容器的方法

override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(true)
        print("aparecio la vista")
        containerView.frame.size.height += 150
        self.feed.frame.size.height += 150.0
        self.photoFeedVC.tableView.frame.size.height += 150.0
        self.postFeedVC.tableView.frame.size.height += 150
        self.scrollView.contentSize.height = containerView.height + 10
        self.scrollView.layoutIfNeeded()
    

【问题讨论】:

【参考方案1】:

有问题的错误消息是说您正在固定 2 个不在同一层次结构中的视图。你在某处错过了addSubview() 调用(虽然我不能确切地说出在哪里,因为似乎有很多子视图控制器,我不确定层次结构应该是什么样的)。

您还同时进行了框架数学和自动布局,除了极少数情况外,这不是您想要的。如果你想使用自动布局,你应该修改约束来扩展容器,而不是调整任何东西的frame.height

【讨论】:

我已编辑问题以显示视图组合以及如何将孩子添加到视图中。这所有的元素都在一个滚动视图中。框架增加问题是客户端要求在滚动时隐藏上部,因此解决方案是增加容器高度,问题是两个表视图都没有像容器那样长大。

以上是关于如何添加约束以将 tableview 固定到其父底部的主要内容,如果未能解决你的问题,请参考以下文章

TextView的自动高度,在tableView的单元格中使用autolayout

如何以编程方式将约束添加到 tableView 单元格的默认 textLabel 和 accessoryView

如何将自动布局约束添加到 tableview headerView 内的多行 UILabel?

如何以编程方式将约束添加到tableView单元格的默认textLabel和accessoryView

修改或添加以将 NOT NULL 约束添加到列?甲骨文

以编程方式将约束添加到相对于同级的视图