设置 UITableView 的框架以匹配其内容大小

Posted

技术标签:

【中文标题】设置 UITableView 的框架以匹配其内容大小【英文标题】:Setting frame of a UITableView to match its content size 【发布时间】:2012-03-31 13:29:00 【问题描述】:

我在较大的 UIScrollView 中有一个非滚动 UITableView。由于表格视图是非滚动的,我希望它的框架大小总是匹配它的内容大小。

我调用了以下方法:

- (void)resizeTableViewFrameHeight

    // Table view does not scroll, so its frame height should be equal to its contentSize height
    CGRect frame = self.tableView.frame;
    frame.size = self.tableView.contentSize;
    self.tableView.frame = frame;

问题是我必须在错误的时间调用此方法(在设置 contentSize 之前)。我想知道,我可以在 UITableView 上设置一个属性,使其框架始终自动匹配其内容大小吗?

【问题讨论】:

【参考方案1】:

没有动态调整表格视图框架的属性。另外,我不认为UITableView 可以预先计算其整个contentSize,因为表格视图的大小实际上可能是无限的,这取决于从其datasource 和其他委托方法(例如heightForRowAtIndexPath)中指定的内容.这些方法可以是动态的,因此几乎不可能预测 table view 的整个大小。

我的结论是您可能没有正确使用此 UI 元素。

解决方法:

通过将表格视图的框架限制在滚动视图的可见区域,您可以简单地允许它滚动。也许您需要防止滚动视图在表格视图滚动时滚动,反之亦然。您可以在UIScrollView 委托方法中轻松完成此操作。

【讨论】:

感谢您的意见。我不能让我的表格视图滚动,这对我的 UI 没有意义。但我想我只需要自己调整框架的大小。【参考方案2】:

我需要在 ios 8 中做这样的事情:一个滚动视图,其中包含一个非滚动的固定宽度表格视图,内容行数可变,所以我想动态调整表格视图的高度。

对我有用的是使用虚拟值在表视图上设置高度约束,然后为表视图和约束创建出口。那么这就是我所需要的:

class ViewController: UIViewController, UITableViewDataSource 

    @IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidAppear(animated: Bool) 
        super.viewDidAppear(animated)
        tableViewHeightConstraint.constant = tableView.contentSize.height
    

    // (plus additional data source methods, etc.)

我可以想象这样的情况(可能有很多行,或高度可变的行)可能不是那么简单,但这对我有用。

【讨论】:

以上是关于设置 UITableView 的框架以匹配其内容大小的主要内容,如果未能解决你的问题,请参考以下文章

滚动到 UITableView 框架之外

设置 UICollectionViewLayout 以匹配列拆分 UITableView 类似结果

如何将 UITableView 高度更改为其内容高度并且仍然具有可点击的内容?

拖动滚动 UITableView 本身而不是其内容

使用自动布局将子视图添加到 UITableView 不会设置其框架

设置 tableviewcell 高度以显示具有动态高度单元格的完整内部/嵌套 uitableview