【发布时间】:2017-04-22 00:35:21
【问题描述】:
我有一个动态单元格大小的 TableView:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 20
我的单元格里面有文本,当然,文本高度可以根据其内容的功能而改变。
有时我只有一条线,有时我有更多,这意味着有时我的单元格高度为 20,有时更多。
当我尝试重新加载我的 tableview 数据并滚动到顶部时遇到问题。
这就是我的工作:
myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadData()
很难向您展示这种情况,但它不会滚动到Y = 0,而是滚动到Y = 100 或类似的东西。因为我的单元格大小会随着要显示的内容的功能而变化。
如果我删除动态大小并执行:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 20
}
并且仍然滚动到顶部:
myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadData()
==> 这是有效的,我滚动到Y = 0
我想我什么都试过了:
scrollToRow
scrollRectToVisible
scrollsToTop
我仍然有这个问题。
唯一可行的方法是如果我延迟reloadData:
myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
tableView.reloadData()
}
这是可行的,但它会产生“故障” => 它会显示新数据然后自动滚动到顶部,这对用户来说是令人不安的。
另一种解决方案是使用“reloadSections”:
myTableViewDatas = newDatas
tableView.setContentOffset(CGPoint.zero, animated: false)
tableView.reloadSections(IndexSet(integer: 0), with: .none) // I have only one section
它也可以工作,但它也会产生“故障”,这就像 TableView 重新加载了一个动画(即使我设置了 .none),其中显示的单元格在新数据的功能中被缩小/放大。
我真的找不到“合适的”解决方案来解决这个问题,有没有人遇到过这个问题? TY
【问题讨论】:
-
如果更改调用顺序会怎样?您可以滚动到顶部,然后重新加载数据。
-
@Holly 感谢您的回答,如果我更改通话顺序 => 什么都没有发生,它滚动到顶部的唯一方法是我将 contentOffset 设置为 0,然后重新加载数据。
-
您从哪个线程执行该代码?
-
@Holly 一切都在主线程中完成,我有 IBAction,用户可以在其中过滤 TableView 中显示的结果
标签: ios uitableview swift3 scrolltop