我有一个UITableView
,实现了一种“无限滚动”。
这是通过计算新数据的IndexPath
然后传递到tableView.insertRows(at: indexPaths, with: .none)
来完成的。
我的数据从50
页的api返回。但是,我看到的是,当用户非常快速地滚动到底部时,表将插入行,然后跳到更远的部分,基本上失去了位置。
我的表格是使用此代码段创建的
private func addTableView() {
tableView = UITableView(frame: .zero)
tableView.showsVerticalScrollIndicator = false
tableView.showsHorizontalScrollIndicator = false
tableView.rowHeight = UITableView.automaticDimension
tableView.bounces = true
tableView.estimatedRowHeight = 200
tableView.separatorStyle = .none
tableView.isHidden = true
tableView.backgroundColor = .clear
tableView.tableFooterView = UIView()
addSubview(tableView)
tableView.position(top: topAnchor, leading: leadingAnchor, bottom: bottomAnchor, trailing: trailingAnchor)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseID)
}
然后使用
触发重新加载 func insertRows(_ indexPaths: [IndexPath]) {
UIView.performWithoutAnimation {
tableView.insertRows(at: indexPaths, with: .none)
self.tableView.isHidden = false
}
}
我使用performWithoutAnimation
是因为我不喜欢任何用于插入行的动画。
在我的视图模型中,我注入符合FeedTableViewProvider
的{{1}}并具有以下方法
UITableViewDataSource, UITableViewDelegate
答案 0 :(得分:1)
我怀疑这实际上与使用
有关tableView.rowHeight = UITableView.automaticDimension
....
tableView.estimatedRowHeight = 200
当插入新单元格时,位置随着偏移量的变化而变化。
我将从保留包含您的细胞高度的某种缓存开始
private var sizeCache: [IndexPath: CGFloat] = [IndexPath: CGFloat]()
然后您可以在单元格滚动到屏幕之外时捕获它
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
sizeCache[indexPath] = cell.frame.size.height
}
现在请确保从缓存中应用该大小
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return sizeCache[indexPath] ?? UITableView.automaticDimension
}
现在,当插入单元格并且它们以新的偏移量跳转时,它们应该以正确的高度进行渲染,这意味着视图应该基本上保持在原位。
答案 1 :(得分:0)
在将新数据添加到tableview时使用此代码。
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 0) as IndexSet, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()
答案 2 :(得分:-1)
您可以在Tableview中的每个新行数据插入上使用此功能,以防止滚动到底部。
Edittext val;
inside button.setOnClickListener(){
val.settext(null);
}