J'écris une vue de la table où les lignes sont ajoutées lors de l'interaction de l'utilisateur. Le comportement général est simplement d'ajouter une seule ligne, puis faites défiler jusqu'à la fin de la table.UITableView ajouter des lignes et faire défiler vers le bas
Cela fonctionnait parfaitement bien avant iOS11, mais maintenant le défilement saute toujours du haut de la table au lieu de défiler en douceur.
Voici le code qui a à voir avec l'ajout de nouvelles lignes:
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)
}
}
Et
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)
}
Je suis convaincu que l'erreur réside dans le fait que plusieurs mises à jour de l'interface utilisateur sont poussés à la time (en ajoutant des lignes et en recalculant des encarts de bord), et essayé de chaîner ces fonctions avec des objets CATransaction
distincts, mais cela complique complètement les blocs d'achèvement asynchrones définis ailleurs dans le code qui mettent à jour certains éléments de l'UI de la cellule.
Ainsi, toute aide serait appréciée :)
GENIUS! layoutIfNeeded est un must !! –