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

ScrollView内嵌EditText滚动事件冲突处理

UINavigationViewController 控件 UIContainerView 嵌入 segue

html内嵌iframe网页高度自适应

如何将数据传递给嵌套控制器(UIContainerView)?

从嵌入在 UIContainerView 中的视图调用父视图的方法。迅速