私は、ユーザーの操作に応じて行が追加されるテーブルビューを作成しています。一般的な動作は、単一行を追加してから、表の最後までスクロールすることです。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は必須です! –