UITableView 添加行并滚动到底部
UITableView add rows and scroll to bottom
我正在编写一个 table 视图,其中的行是在用户交互时添加的。一般行为只是添加一行,然后滚动到 table.
的末尾
这在 iOS11 之前工作得很好,但现在滚动总是从 table 的顶部跳转,而不是平滑滚动。
这是与添加新行有关的代码:
func updateLastRow() {
DispatchQueue.main.async {
let lastIndexPath = IndexPath(row: self.currentSteps.count - 1, section: 0)
self.tableView.beginUpdates()
self.tableView.insertRows(at: [lastIndexPath], with: .none)
self.adjustInsets()
self.tableView.endUpdates()
self.tableView.scrollToRow(at: lastIndexPath,
at: UITableViewScrollPosition.none,
animated: true)
}
}
和
func adjustInsets() {
let tableHeight = self.tableView.frame.height + 20
let table40pcHeight = tableHeight / 100 * 40
let bottomInset = tableHeight - table40pcHeight - self.loadedCells.last!.frame.height
let topInset = table40pcHeight
self.tableView.contentInset = UIEdgeInsetsMake(topInset, 0, bottomInset, 0)
}
我确信错误在于多个 UI 更新被同时推送(添加行和重新计算边缘插入),并尝试使用单独的 CATransaction
链接这些函数对象,但这完全弄乱了代码中其他地方定义的异步完成块,这些块更新了一些单元格的 UI 元素。
因此,我们将不胜感激:)
确保您尊重安全区。
更多详情,请查看:https://developer.apple.com/ios/update-apps-for-iphone-x/
我设法通过在调整插图之前简单地调用 self.tableView.layoutIfNeeded()
来解决问题:
func updateLastRow() {
DispatchQueue.main.async {
let lastIndexPath = IndexPath(row: self.currentSteps.count - 1, section: 0)
self.tableView.beginUpdates()
self.tableView.insertRows(at: [lastIndexPath], with: .none)
self.tableView.endUpdates()
self.tableView.layoutIfNeeded()
self.adjustInsets()
self.tableView.scrollToRow(at: lastIndexPath,
at: UITableViewScrollPosition.bottom,
animated: true)
}
}
我正在编写一个 table 视图,其中的行是在用户交互时添加的。一般行为只是添加一行,然后滚动到 table.
的末尾这在 iOS11 之前工作得很好,但现在滚动总是从 table 的顶部跳转,而不是平滑滚动。
这是与添加新行有关的代码:
func updateLastRow() {
DispatchQueue.main.async {
let lastIndexPath = IndexPath(row: self.currentSteps.count - 1, section: 0)
self.tableView.beginUpdates()
self.tableView.insertRows(at: [lastIndexPath], with: .none)
self.adjustInsets()
self.tableView.endUpdates()
self.tableView.scrollToRow(at: lastIndexPath,
at: UITableViewScrollPosition.none,
animated: true)
}
}
和
func adjustInsets() {
let tableHeight = self.tableView.frame.height + 20
let table40pcHeight = tableHeight / 100 * 40
let bottomInset = tableHeight - table40pcHeight - self.loadedCells.last!.frame.height
let topInset = table40pcHeight
self.tableView.contentInset = UIEdgeInsetsMake(topInset, 0, bottomInset, 0)
}
我确信错误在于多个 UI 更新被同时推送(添加行和重新计算边缘插入),并尝试使用单独的 CATransaction
链接这些函数对象,但这完全弄乱了代码中其他地方定义的异步完成块,这些块更新了一些单元格的 UI 元素。
因此,我们将不胜感激:)
确保您尊重安全区。 更多详情,请查看:https://developer.apple.com/ios/update-apps-for-iphone-x/
我设法通过在调整插图之前简单地调用 self.tableView.layoutIfNeeded()
来解决问题:
func updateLastRow() {
DispatchQueue.main.async {
let lastIndexPath = IndexPath(row: self.currentSteps.count - 1, section: 0)
self.tableView.beginUpdates()
self.tableView.insertRows(at: [lastIndexPath], with: .none)
self.tableView.endUpdates()
self.tableView.layoutIfNeeded()
self.adjustInsets()
self.tableView.scrollToRow(at: lastIndexPath,
at: UITableViewScrollPosition.bottom,
animated: true)
}
}