带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度

Posted

技术标签:

【中文标题】带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度【英文标题】:UITableView dynamic content size height inside UIScrollView with AutoLayout 【发布时间】:2016-02-22 13:47:51 【问题描述】:

我有一个UIScrollView,在这个UIScrollView里面我有一个UIView,在UIView里面我有一些UITextField's,一些UILabel's,在底部有一个UITableView

我希望UITableView 适合其内容高度,UIView 适合其内容高度,UIScrollView 适合其内容高度。

UITableView 的高度可能会随着我在使用过程中添加/删除单元格而改变。

使用 AutoLayout 处理它的最佳方法是什么?

- UIViewController
-- UIView
--- UIScrollView
---- UIView
----- UILabel
----- UITextField
----- UITextView
----- UITableView (at the bottom of the superview)

或在 xib 中:

【问题讨论】:

您通常不应该嵌套滚动视图。那里有疯狂。如果您打算显示所有内容,请考虑在没有滚动视图的情况下实现类似 tableview 的视图。 无论如何我都会展示所有这些,这是真的,但是,它应该是单元格,因为用户将动态添加和删除某些行,这是处理这种情况的最佳方法是通过使用 UITableView。 只使用表格视图。无论如何,它是一个滚动视图,它可以包含您放入滚动视图的所有内容。不需要额外的滚动视图。只需使用单个表格视图。 @Fogmeister 是对的,没有火箭科学,试试吧。起初看起来很凝灰岩,但它很容易实现。 【参考方案1】:

实现这一点的最佳方法是废弃您现在拥有的层次结构并执行以下操作...

- UIViewController (or UITableViewController)
--- UITableView
----- UIView (as the tableView.tableHeaderView)
------- UILabel
------- UITextField
------- UITextView
----- Rest of the cells for the table view.

tableView.tableHeaderView 是一个单一的(不可重用的、具体的)视图,它位于表格视图内容的顶部,并随着表格视图的内容滚动。它不像节标题视图那样粘在屏幕顶部。

这将允许您删除滚动视图并将所有内容放在表格视图中,并且仍然不会更改您用于填充单元格的方法,因为它保持不变。

【讨论】:

这正是我此刻的想法!很好的回答人!【参考方案2】:

@Jan Greve 是正确的。但如果你还想做的话

    将 Table View 与其父视图之间的 Bottom Space to Container 约束设置为 0 每次插入/删除都会增加/减少表格视图的高度限制(您必须以编程方式执行此操作) 将滚动视图的内容偏移设置为新的视图高度

【讨论】:

【参考方案3】:

AutoLayout 最好的部分是现在您不必担心UIScrollView 的内容大小。

如果您正确设置了所有约束(没有任何警告)AutoLayout 管理滚动视图本身的内容大小。

设置所有子视图的约束,但不要添加heightwidth 约束。

对于contentSize,将内部视图(滚动视图的子视图)的底部约束添加到UIScrollView。这将增加 scrollView 内容的大小和高度,因为内部视图会扩大或缩小。

更多详情:我问过question,你可以查看。您可以找到有问题的代码。

【讨论】:

【参考方案4】:

您可以为 tableView 设置固定高度并将约束链接到插座。然后您需要覆盖 viewDidLayoutSubviews() 以便根据表格的 contentSize 动态设置高度:

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

internal override func viewDidLayoutSubviews() 
    let height = min(self.view.bounds.size.height, self.tableView.contentSize.height)
    self.dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()

【讨论】:

以上是关于带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度的主要内容,如果未能解决你的问题,请参考以下文章

带有约束的 iOS 6.0 AutoLayout 问题:旋转时子视图消失

带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度

将带有 ScrollView 和 AutoLayout 的 UIViewController 添加到另一个 UIViewController

Autolayout 不适用于带有 Storyboard 的 NSSplitView 和 NSPageController。这是苹果虫吗?

使用 Swift、autolayout 和 SnapKit 使带有 UIImageView 的 UIScrollView 自动缩放内容

带有砌体的iOS AutoLayout,未能将子底部设置为父底部