将 TableView 的高度设置为其单元格高度的总和 (Swift 2.0)

Set height of TableView as the sum of the heights of its cells (Swift 2.0)

我有一个 TableView,它在 ScrollView 中不断变化(插入和删除单元格)。我已禁用 TableView 的滚动,因为 TableView 上方有一个 MapView,我想在用户向上滚动时滚动整个 View,而不仅仅是 TableView。由于单元格不断地插入和删除到 TableView,因此 TableView 的高度不会在应用程序运行的整个过程中固定 运行。

我正在尝试不断设置 TableView 的高度以匹配内部内容总和的高度,

func someFunc() {

    // call viewDidAppear to update TableView
    viewDidAppear(true)

    // Calculate the size of the ScrollView
    var y: CGFloat = 10
    y = mapView.bounds.size.height + tableView.bounds.size.height + 10
    var sz = scrollView.bounds.size
    sz.height = y
    scrollView.contentSize = sz

}

// Update the TableView on main thread
override viewDidAppear(animated: Bool) {
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.tableView.reloadData()
        var frame: CGRect =  self.tableView.frame
        frame.size.height = self.tableView.contentSize.height
        self.tableView.bounds.size.height = frame.size.height
    })
}

但是,tableView.bounds.size.height 没有更新到新的内容高度。实际上它 有时 更新一次,也许每隔几次调用一次。我几乎可以肯定这是因为 dispatch_asyn() 是一种异步方法。所以,我可能需要在方法中 return 来解决这个问题,但我不确定如何。

我这样做是否正确以完成我所需要的?有一个更好的方法吗?非常感谢任何帮助。

我想出了如何做到这一点,以防万一其他人需要实施类似的东西。

将 Table View 连接到插座并将 UITableViewDelegateUITableViewDataSource 协议添加到 View Controller 后,您可以通过编程方式设置 [=31] 的高度=]通过

查看单元格
self.tableView.rowHeight = 100.0

在你的 viewDidLoad().

然后,如果您 Table 查看数据来自数组,您可以将 tableView 的高度重置为

self.tableView.bounds.height = CGFloat(dataArray.count) * (self.tableView.rowHeight)

请注意如何将 dataArray 的长度转换为 CGFloat,因为 self.tableView.bounds.height 是 CGFloat 类型。

现在 Table 视图的高度是其所有单元格的高度之和。

即使 Ivan 的解决方案适用于大小相等且大小固定的行,但如果您要处理 UITableViewAutomaticDimension 以及每行的不同高度,它就不会适用。

如果您需要所有行的实际高度之和,您可以简单地定义一个计算变量,它在需要时更新布局后 tableView 的 contentSize 的 returns 高度。

var tableViewHeight: CGFloat {
    tableView.layoutIfNeeded()
    return tableView.contentSize.height
}

直接使用 tableView.contentSize.height 可能会导致您得到估计行高的总和而不是实际高度。

您可以使用我在上面给出的变量,也可以禁用估计高度(如果您不需要它,正如 Apple 开发人员在此处提到的那样:Apple Developer Forum Discussion - UITableView's contentSize is wrong

顺便说一下,Whosebug 中已经存在对类似问题的类似答案。您也可以在这里查看: