【问题标题】:Set height of TableView as the sum of the heights of its cells (Swift 2.0)将 TableView 的高度设置为其单元格高度的总和(Swift 2.0)
【发布时间】:2019-02-12 21:16:19
【问题描述】:

我有一个在 ScrollView 中不断变化(插入和删除单元格)的 TableView。我禁用了 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() 是一种异步方法。所以,我可能需要返回方法来解决这个问题,但我不确定如何。

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

【问题讨论】:

    标签: swift uitableview uiscrollview tableview dispatch-async


    【解决方案1】:

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

    将 Table View 连接到插座并将UITableViewDelegate 和 UITableViewDataSource 协议添加到 View Controller 后,您可以通过以下方式以编程方式设置 Table View Cell 的高度

    self.tableView.rowHeight = 100.0
    

    在你的viewDidLoad()。

    然后,如果您的表格视图数据来自数组,您可以将tableView 的高度重置为

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

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

    现在表格视图的高度是所有单元格总和的高度。

    【讨论】:

      【解决方案2】:

      即使 Ivan 的解决方案适用于大小相同且大小固定的行,但如果您处理的是 UITableViewAutomaticDimension 和每行的不同高度,它就行不通了。

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

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

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

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

      顺便说一句,StackOverFlow 中已经存在对类似问题的类似答案。你也可以在这里查看:Stackoverflow - Get Height of Table Contents in Swift

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 2020-07-06
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多