在不改变滚动位置的情况下将行插入 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

的例子

到目前为止我尝试过的:

在您的情况下,您不需要为 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)