2017-10-06 182 views
4

我正在寫一個表視圖,在用戶交互時添加行。一般行爲僅僅是添加一行,然後滾動到表的結尾。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元素的其他位置定義的異步完成塊。

所以,任何幫助將不勝感激:)

回答

1

我設法通過簡單地調整插圖之前只是打電話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) 
    } 
} 
+1

GENIUS! layoutIfNeeded是必須的! –

相關問題