在不改变滚动位置的情况下将行插入 TableView
Insert rows into TableView onto without changing scroll position
我想在索引 0 上方的 UITableView 中插入新行,类似于 iMessage 在您向上滚动并加载以前的消息时的做法。
这是我当前的实现:
let indexPaths = (0..<newItemsCount).map { IndexPath(row: [=10=], section: 0) }
tableView.beginUpdates()
tableView.insertRows(at: indexPaths, with: .top)
tableView.endUpdates()
然而,这会导致 table 视图突然跳转。
这是 iMessage
的例子
到目前为止我尝试过的:
- 在插入新行之前将内容偏移量设置为原始偏移量
- 在我插入新行之前滚动到位于顶部的单元格,这实际上会导致 table 视图
闪烁
- 正在重新加载数据
在您的情况下,您不需要为 tableView 创建 beginUpdates/endUpdates/insertRows,只需插入一个新模型并重新加载 tableView 即可。
您可以这样解决问题:
// Calculate the distance of the tableView
// from the current content offset to the end of the content size
let distanceFromOffset = self.tableView.contentSize.height - self.tableView.contentOffset.y
// Insert new model into the list model at zero index
self.messages.insert(message, at: 0)
self.tableView.reloadData() // reload tableView
// Calculate new content offset after reload tableView
let offset = self.tableView.contentSize.height - distanceFromOffset
self.tableView.layoutIfNeeded()
// set new content offset for the tableview without animation
self.tableView.setContentOffset(CGPoint(x: 0, y: offset), animated: false)
我想在索引 0 上方的 UITableView 中插入新行,类似于 iMessage 在您向上滚动并加载以前的消息时的做法。
这是我当前的实现:
let indexPaths = (0..<newItemsCount).map { IndexPath(row: [=10=], section: 0) }
tableView.beginUpdates()
tableView.insertRows(at: indexPaths, with: .top)
tableView.endUpdates()
然而,这会导致 table 视图突然跳转。 这是 iMessage
的例子到目前为止我尝试过的:
- 在插入新行之前将内容偏移量设置为原始偏移量
- 在我插入新行之前滚动到位于顶部的单元格,这实际上会导致 table 视图 闪烁
- 正在重新加载数据
在您的情况下,您不需要为 tableView 创建 beginUpdates/endUpdates/insertRows,只需插入一个新模型并重新加载 tableView 即可。
您可以这样解决问题:
// Calculate the distance of the tableView
// from the current content offset to the end of the content size
let distanceFromOffset = self.tableView.contentSize.height - self.tableView.contentOffset.y
// Insert new model into the list model at zero index
self.messages.insert(message, at: 0)
self.tableView.reloadData() // reload tableView
// Calculate new content offset after reload tableView
let offset = self.tableView.contentSize.height - distanceFromOffset
self.tableView.layoutIfNeeded()
// set new content offset for the tableview without animation
self.tableView.setContentOffset(CGPoint(x: 0, y: offset), animated: false)