UIContainerView 内容高度(内嵌 UITableViewController)
Posted
技术标签:
【中文标题】UIContainerView 内容高度(内嵌 UITableViewController)【英文标题】:UIContainerView height of content (embedded UITableViewController) 【发布时间】:2015-02-09 14:25:24 【问题描述】:我目前在 Interface Builder 的 UIContainerView 中嵌入了一个 UITableViewController。有没有办法将 UIContainerView 的高度设置为内容的高度(使用原型单元格)?基本上,我想要的是在我的 UIContainerView 周围有一个 UIScrollView,并为我的 UIContainerView 设置一些 AutoLayout 规则,以便根据内部单元格的数量计算高度,并且父 UIScrollView 相应地调整其滚动区域。
编辑
感谢出色的答案,最终使用以下代码更改了框架高度:
alarmsTableViewController.view.layoutIfNeeded()
println(alarmsTableViewController.tableView.contentSize.height)
alarmsContainerView.frame.size.height = alarmsTableViewController.tableView.contentSize.height
【问题讨论】:
【参考方案1】:需要编程干预:UITableViews 当然是 UIScrollViews,嵌套的滚动视图不能在 AutoLayout 中调整自己的大小。这是一个合理的歧义,因为 AutoLayout 不知道使框架更小并需要更多滚动,或者框架更大而滚动更少。在您的情况下,您希望后者不滚动。
解决这个问题的最简单方法是为 TableView(或其容器视图)的高度创建一个约束。这将作用于 tableView 的框架,如果在任何方向上设置为大于内容大小(仅在 tableviews 中垂直),滚动视图将不会滚动。最好在包含 tableView 的视图中添加/修改它。然后访问表视图的 contentSize 属性。实际代码很简单:
-(void)updateViewConstraints
self.tableViewHeightLayoutConstraint.constant = self.tableviewInMyScrollView.contentSize.height;
[super updateViewConstraints];
如果滚动视图中的其他所有内容的高度和宽度在 AutoLayout 引擎运行时已固定,则应自动调整滚动视图的大小以适应其内容。
【讨论】:
感谢您的精彩解释。最终直接覆盖了框架,因为我的带有 tableView 的 containerView 已经在 tableFooterView 中(哇,复杂的东西:])。查看我的编辑。 嗯,通常一个硬性的建议是 setFrame 不会为布局约束提供信息。但是这个scrollviews-in-scrollviews是一个非常不稳定的区域,甚至在tableFooterView的最后一个细节之前,它可能正在做一些事情来获取这些信息,很高兴我能提供帮助。 好吧,因为我没有将 setFrame 高度值提供给布局约束(因为这在 tableFooterView 中实际上是不可能的),这一切都很好:) 谢谢!【参考方案2】:我在我的项目中所做的是在 ViewController 上的 -(void)updateViewConstraints
内更新由 IBOutlet
给出的约束,具体取决于 tableView 内的单元格数量。例如:
-(void)updateViewConstraints
float newHeigh = ([self.array count] + 1) * 84;
self.topViewHeightConstraint.constant = newHeigh + 540;
[super updateViewConstraints];
【讨论】:
感谢您的回答。我考虑过使用单元格的高度来计算,但由于现在使用自动布局来计算单元格高度要容易得多,所以我发现这个解决方案有点脆弱。最终使用了 tableView 的 contentSize。以上是关于UIContainerView 内容高度(内嵌 UITableViewController)的主要内容,如果未能解决你的问题,请参考以下文章
无法将 UIContainerView 添加到 UIScrollView
UINavigationViewController 控件 UIContainerView 嵌入 segue