斯威夫特3 |具有动态单元大小的reloadData上的TableView ScrollToTop

时间:2017-04-22 00:35:22

标签: ios uitableview swift3 scrolltop

我有一个动态单元格大小的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

2 个答案:

答案 0 :(得分:0)

嗯,有时你会搜索复杂的解决方案,事实上这很简单。 我做了: - 先重装 - scrollToIndexPath 0秒 - >它的工作原理

myTableViewDatas = newDatas
tableView.reloadData()
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)

答案 1 :(得分:0)

我也有同样的问题。 [UITableView reloadData]无法达到我们预期的效果。 它没有从cleanslate布局tableView。

  
    

从头开始重新加载所有内容。重新显示可见的行。请注意,这将导致删除任何现有的放置占位符行。

  

它说重新显示可见的行。这就是我所做的。

routes/api.php