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)
    }
}