Comment faire pour détecter que l'animation s'est terminée sur UITableView beginUpdates/endUpdates?
Je suis l'insertion, la suppression d'une cellule de tableau à l'aide de insertRowsAtIndexPaths/deleteRowsAtIndexPaths
enveloppé dans beginUpdates/endUpdates
. Je suis également en utilisant beginUpdates/endUpdates
lors du réglage de rowHeight. Toutes ces opérations sont animés par défaut.
Comment puis-je détecter que l'animation s'est terminée lors de l'utilisation de beginUpdates/endUpdates
?
- Pour info: Cela s'applique à
-scrollToRowAtIndexPath:atScrollPosition:animated:
ainsi.
Vous devez vous connecter pour publier un commentaire.
Quoi à ce sujet?
Cela fonctionne parce que la tableView animations utilisation
CALayer
animations en interne. C'est, ajoutent-ils les animations pour tous lesCATransaction
. Si aucuneCATransaction
existe (le cas normal), alors on est implicitement a commencé, qui est terminé à la fin de l'actuel runloop. Mais si vous commencez à vous-même, comme cela est fait ici, alors il va l'utiliser.completionBlock
avantbeginUpdates
etendUpdates
comme dans l'extrait?NSFetchedResultsControllerDelegate
protocole.[CATransaction begin]
est appelé danscontrollerWillChangeContent
juste avant[tableView beginUpdates]
. Même chose danscontrollerDidChangeContent
.[CATransaction commit]
est appelé avant[tableView endUpdates]
.[CATransaction commit]
doit être appelée après pas avant[tableView endUpdates]
.-reloadData
trop pour que je puisse obtenir correct de la taille du contenu à droite après le tableau de fin de rechargement et de contenu d'ensemble de l'aligner en bas de l'écranSwift Version
Vous pouvez joindre à votre opération(s) de UIView bloc d'animation comme:
Crédits à https://stackoverflow.com/a/12905114/634940.
endUpdates
, mais avant de les animations avaient terminé.Une solution possible pourrait être d'hériter de la UITableView sur lequel vous appelez
endUpdates
et remplacer sonsetContentSizeMethod
, depuis UITableView ajuste son contenu, de la taille de la ajouté ou supprimé des lignes. Cette approche devrait également fonctionner pour lesreloadData
.Pour s'assurer qu'une notification est envoyée seulement après
endUpdates
est appelé, on pourrait aussi remplacerendUpdates
et de définir un indicateur de là.N'ai pas trouvé une bonne solution pour le moment (à court de sous-classement UITableView). J'ai décidé d'utiliser
performSelector:withObject:afterDelay:
pour l'instant. Pas l'idéal, mais fait le travail.Mise à JOUR: On dirait que je peux utiliser
scrollViewDidEndScrollingAnimation:
à cette fin (c'est spécifique à ma mise en œuvre, voir le commentaire).scrollViewDidEndScrollingAnimation
n'est appelée en réponse àsetContentOffset
etscrollRectToVisible
Si vous ciblez iOS 11 et ci-dessus, vous devez utiliser
UITableView.performBatchUpdates(_:completion:)
à la place:Vous pouvez utiliser
tableView:willDisplayCell:forRowAtIndexPath:
comme:Mais ce sera aussi appelée lorsque une cellule qui se trouve déjà dans la table se déplace à partir de l'écran sur l'écran de sorte qu'il peut ne pas être exactement ce que vous cherchez. Je viens de regarder à travers toutes les
UITableView
etUIScrollView
délégué méthodes et il ne semble pas être quelque chose à gérer, juste après qu'une cellule est inséré animation.Pourquoi ne pas simplement appeler la méthode que vous souhaitez être appelé lorsque l'animation se termine après le
endUpdates
?willDisplayCell
fonctionne. J'ai besoin d'elle à se produire après l'animation parce que j'ai besoin de faire une mise à jour de visual seulement après, tout s'installe.