【问题标题】:Why does content size of UITableView Change为什么 UITableView 的内容大小会发生变化
【发布时间】:2017-08-22 09:24:24
【问题描述】:

我有一个 UITableView,我在 3 个块中加载我的数据。我加载最新的 10 条记录,当用户使用 UIRefreshControl 拉起时,我加载前 10 条记录并显示前一个块的最后一行。我在从数据库加载新集合之前存储了以前的内容大小

previousContentSizeHeight = tableView.contentSize.height

然后当数据到来并更新我的数组时,我使用previous来计算表的新内容大小

let difference = tableView.contentSize.height - 
     previousContentSizeHeight - MinimumCellHeight

self.messageTableView.setContentOffset(CGPoint(x: 0, y: difference), animated: false)

这在大多数情况下都有效。在加载第一个集合和加载第二个集合时,它在 viewDidAppear 之后的行为正确,但在第三个集合中它开始改变内容大小。会减少!我的理解是,如果我向其中添加数据(不删除任何内容),内容大小只会增加。 我在代码中的多个位置读取了类似此事件的表格内容大小:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    print("tableView.contentSize.height is: \(tableView.contentSize.height)")
}

当我上下滚动时,我看到数字减少,有时增加和减少 为什么内容大小会改变大小!?

注意:我想坚持使用内容偏移量。我比 IndexPath 更幸运。

更新 #1 @Sohil R. Memon:我试过你的建议。根据屏幕截图,我添加了一条打印语句,您可以看到 viewDidLayoutSubviews 仍未执行。我尝试使用 self.messageTableView 和 tableView 在 endDisplaying

【问题讨论】:

  • 您不应该将每个数据提取上的contentSize 设置为yourDataSourceArray.count * minimumCellHeight 之类的东西吗?
  • @Rikh 如果高度的内容是动态计算的呢?这会导致错误的行为
  • 很公平,在这种情况下,您必须根据约束计算最小高度并使用它

标签: ios swift uitableview uiscrollview


【解决方案1】:

一旦显示单元格并调用didEndDisplaying,还有更多的事情需要处理,当您滚动cellForItem 时再次调用,这会为您提供不同的大小。

为了在显示所有单元格后获得UITableView 的确切contentSize,您可以通过以下方法获得它。只需在 UIViewController 类中编写以下方法即可。

override func viewDidLayoutSubviews() {
    print(tableView.contentSize.height) //Exact Content Size of UITableView
}

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    tableView.layoutIfNeeded()
}

希望这会有所帮助!

【讨论】:

  • 感谢您的回答。我的问题在视图的初始加载时没有发生。那么它工作正常。我的问题是在加载第 3 个块时,第 3 次调用数据库以获取第 3 组。我添加了您提到的事件,但是当表格内容更改或触发 didEndDisplaying 事件时,它不会被调用。
  • "告诉代理指定的单元格已从表格中删除。"那是在文档中。您在错误的上下文中使用它。
  • 是的,毫无疑问,文档和上下文也是正确的,因为当单元格正确排列并从UITableView 中删除时,您将得到准确的contentSize !如果您有更多困惑,请告诉我!
猜你喜欢
  • 1970-01-01
  • 2018-05-01
  • 2017-09-28
  • 2012-05-21
  • 2015-01-18
  • 2021-05-05
  • 1970-01-01
  • 2020-01-18
  • 2021-04-30
相关资源
最近更新 更多