问题描述
我已经为表格视图建立了分页机制,因此当用户滚动到该部分的最后一行时,应用程序会尽可能加载其他内容。加载其他内容后,我将在表视图上执行批量更新,如下所示:
guard
let sectionIndex = self.sections.firstIndex(of: .itemsSection),!loadedItems.isEmpty
else { break }
let prevIoUsNumberOfRows = self.tableView.numberOfRows(inSection: sectionIndex)
let additionalIndexPaths = self.generateIndexPaths(
startIndex: prevIoUsNumberOfRows,count: loadedItems.count,section: sectionIndex
)
self.tableView.performBatchUpdates({
self.items.append(contentsOf: loadedItems)
self.tableView.insertRows(at: additionalIndexPaths,with: .automatic)
},completion: nil)
private func generateIndexPaths(startIndex: Int,count: Int,section: Int) -> [IndexPath] {
var indexPaths: [IndexPath] = []
for row in startIndex..<startIndex + count {
indexPaths.append(IndexPath(row: row,section: section))
}
return indexPaths
}
它很好用,直到在滚动表视图时发生更新为止。附加内容的加载速度如此之快,以至于滚动动画没有时间完成。它开始跳跃,其他单元格随着动画破裂弹出。由于我的表格视图使用UITableView.automaticDimension
,因此我认为这是因为新创建的单元格的估计高度不正确,因此我实现了tableView(_:estimatedHeightForRowAt:) -> CGFloat
方法并为这些单元格提供了非常准确的高度值。但这并没有帮助解决跳跃问题。在尝试了所有可能的UITableView.RowAnimation
适合我的需求之后,我决定完全禁用更新动画。这是我当前更新表格视图的方式:
self.items.append(contentsOf: loadedItems)
UIView.setAnimationsEnabled(false)
self.tableView.insertRows(at: additionalIndexPaths,with: .none)
UIView.setAnimationsEnabled(true)
这种方法摆脱了更新动画,同时又引入了另一个问题:感觉表视图在更新动画期间没有响应,就像我设置isUserInteractionEnabled = false
一秒钟一样。那么用没有动画和跳转的新行更新表视图的最佳方法是什么?在此先感谢:)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)