【问题标题】:What is the expected `contentOffset` of UITableView when calling reloadData()?调用 reloadData() 时 UITableView 的预期 `contentOffset` 是什么?
【发布时间】:2017-07-30 21:01:09
【问题描述】:

我有一个显示自定义单元格的UITableView。通过按一个按钮,用户可以更改我的UITableView的内容

场景:

  1. 加载一个包含 1000 个元素的数组
  2. 将表格滚动到底部(滚动后给我大约 20,000 contentOffset.y
  3. 按下按钮后,我将数组替换为 300 个元素
  4. 在主线程 (gcd) 中调用 reloadData

在第 4 步之后,我的 UITableView 的正确新直接 contentOffset.y 应该是什么?我希望它是 0 并且我的表格滚动到顶部,但由于某种原因它不是并且不会滚动回顶部。这是UITableView的正常行为吗?

【问题讨论】:

    标签: ios uitableview cocoa-touch uikit ios10


    【解决方案1】:

    是的,这是 UITableView 的正常行为。如果您希望表格视图在重新加载后滚动到顶部,则必须使用以下代码来实现。

    let newOffset = CGPoint(x: currentOffset.x, y: 0)
    tableView.setContentOffset(newOffset, animated: false)
    

    在调用 reloadData 函数时,UITableView 会自动保留它的滚动偏移量。

    【讨论】:

      【解决方案2】:

      来自 Apple 的文档...https://developer.apple.com/reference/uikit/uitableview/1614862-reloaddata

      为了提高效率,表格视图只重新显示那些 可见的。如果表格由于以下原因而缩小,它会调整偏移量 重新加载。

      所以,是的,在 reloadData 上一直滚动到顶部是正常的。

      如果您想要滚动到顶部,请使用setContentOffset 或:

      .scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
      

      【讨论】:

      • UITableView 从一开始就这样吗?一直以来,我都认为拨打reloadData 会重置一切。感谢您提供文档链接。
      • 是的,一直都是这样。
      猜你喜欢
      • 2012-01-28
      • 2012-09-29
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多