我正在寫一個表視圖,在用戶交互時添加行。一般行爲僅僅是添加一行,然後滾動到表的結尾。UITableView添加行並滾動到底部
這在iOS11之前工作得很好,但現在滾動總是從表頂部跳轉而不是平滑滾動。
下面是與添加新行做代碼:
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元素的其他位置定義的異步完成塊。
所以,任何幫助將不勝感激:)
GENIUS! layoutIfNeeded是必須的! –