如何添加约束以将 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?