2017-10-06 15 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は必須です! –

-3

セーフエリアを尊重していることを確認してください。詳細について は、チェック:https://developer.apple.com/ios/update-apps-for-iphone-x/

+0

私はドキュメントを見て持っていたが、私はまだ本当にありません間違っていることを理解する。私は 'adjustInsets'パーツをコメントアウトしようとしました。(行を追加してスクロールするだけですが)それはまだ上から飛びます。 – Skwiggs

関連する問題