J'insère / supprime une cellule de tableau en utilisant insertRowsAtIndexPaths/deleteRowsAtIndexPaths
wrapped in beginUpdates/endUpdates
. J'utilise également beginUpdates/endUpdates
lors du réglage de rowHeight. Toutes ces opérations sont animées par défaut.
Comment puis-je détecter que l'animation est terminée lors de l'utilisation beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
la source
la source
-scrollToRowAtIndexPath:atScrollPosition:animated:
également.Réponses:
Et ça?
Cela fonctionne car les animations tableView utilisent des
CALayer
animations en interne. Autrement dit, ils ajoutent les animations à toute ouvertureCATransaction
. S'il n'y a pas d'ouvertureCATransaction
(le cas normal), alors une est implicitement commencée, qui se termine à la fin de la boucle d'exécution actuelle. Mais si vous en commencez un vous-même, comme c'est le cas ici, il utilisera celui-là.la source
completionBlock
avantbeginUpdates
etendUpdates
comme dans l'extrait de code?[CATransaction commit]
devrait être appelé après pas avant[tableView endUpdates]
.Version Swift
la source
Si vous ciblez iOS 11 et supérieur, vous devez utiliser à la
UITableView.performBatchUpdates(_:completion:)
place:la source
Une solution possible pourrait être d'hériter de l'UITableView sur lequel vous appelez
endUpdates
et de l'écrasersetContentSizeMethod
, car UITableView ajuste sa taille de contenu pour correspondre aux lignes ajoutées ou supprimées. Cette approche devrait également fonctionnerreloadData
.Pour s'assurer qu'une notification n'est envoyée qu'après avoir
endUpdates
été appelée, on peut également écraserendUpdates
et définir un indicateur à cet endroit.la source
Vous pouvez inclure vos opérations dans le bloc d'animation UIView comme suit:
Crédits à https://stackoverflow.com/a/12905114/634940 .
la source
endUpdates
, mais avant la fin des animations.Je n'ai pas encore trouvé de bonne solution (à court de sous-classer UITableView). J'ai décidé de l'utiliser
performSelector:withObject:afterDelay:
pour le moment. Pas idéal, mais fait le travail.MISE À JOUR : Il semble que je puisse utiliser
scrollViewDidEndScrollingAnimation:
à cette fin (c'est spécifique à mon implémentation, voir commentaire).la source
scrollViewDidEndScrollingAnimation
est appelé uniquement en réponse àsetContentOffset
etscrollRectToVisible
Vous pouvez utiliser
tableView:willDisplayCell:forRowAtIndexPath:
comme:Mais cela sera également appelé lorsqu'une cellule qui est déjà dans le tableau passe de l'écran hors de l'écran à l'écran, de sorte que ce n'est peut-être pas exactement ce que vous recherchez. Je viens de regarder toutes les méthodes
UITableView
etUIScrollView
déléguer et il ne semble pas y avoir quoi que ce soit à gérer juste après l'insertion d'une cellule.Pourquoi ne pas simplement appeler la méthode que vous souhaitez appeler lorsque l'animation se termine après le
endUpdates
?la source
willDisplayCell
cela fonctionnera. J'ai besoin que cela se produise après l'animation car je n'ai besoin de faire une mise à jour visuelle qu'une fois que tout est réglé.