2017-10-06 4 views
4

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 :)

Répondre

1

J'ai réussi à résoudre le problème simplement appeler juste self.tableView.layoutIfNeeded() avant de régler EISN:

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 est un must !! –

-3

Assurez-vous que vous respectez les zones de sécurité. Pour plus de détails, vérifier: https://developer.apple.com/ios/update-apps-for-iphone-x/

+0

J'ai regardé à la documentation, mais je ne toujours pas vraiment comprendre ce qui ne va pas. J'ai essayé de commenter la partie 'adjustInsets' (donc juste en ajoutant une ligne et en faisant défiler) et ça saute toujours du haut. – Skwiggs