Ich füge eine Tabellenzelle mit insertRowsAtIndexPaths/deleteRowsAtIndexPaths
Wrap-In ein / lösche sie beginUpdates/endUpdates
. Ich benutze auch beginUpdates/endUpdates
beim Anpassen von rowHeight. Alle diese Vorgänge sind standardmäßig animiert.
Wie kann ich feststellen, dass die Animation bei Verwendung beendet wurde beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
Pixelfreak
quelle
quelle
-scrollToRowAtIndexPath:atScrollPosition:animated:
auch für.Antworten:
Was ist damit?
Dies funktioniert, weil die tableView-
CALayer
Animationen intern Animationen verwenden . Das heißt, sie fügen die Animationen zu jedem offenen hinzuCATransaction
. Wenn kein OpenCATransaction
vorhanden ist (der Normalfall), wird implizit eines gestartet, das am Ende des aktuellen Runloops beendet wird. Aber wenn Sie selbst einen beginnen, wie es hier gemacht wird, dann wird es diesen verwenden.quelle
completionBlock
vorher eingestelltbeginUpdates
und magst duendUpdates
im Snippet?[CATransaction commit]
sollte nach nicht vorher aufgerufen werden[tableView endUpdates]
.Schnelle Version
quelle
Wenn Sie auf iOS 11 und höher abzielen, sollten Sie
UITableView.performBatchUpdates(_:completion:)
stattdessen Folgendes verwenden :quelle
Eine mögliche Lösung könnte darin bestehen, von der UITableView zu erben, die Sie aufrufen,
endUpdates
und diese zu überschreibensetContentSizeMethod
, da UITableView die Inhaltsgröße an die hinzugefügten oder entfernten Zeilen anpasst. Dieser Ansatz sollte auch funktionierenreloadData
.Um sicherzustellen, dass eine Benachrichtigung erst nach dem
endUpdates
Aufruf gesendet wird, kann man dort auchendUpdates
ein Flag überschreiben und setzen.quelle
Sie können Ihre Operation (en) wie folgt in den UIView-Animationsblock einschließen:
Credits an https://stackoverflow.com/a/12905114/634940 .
quelle
endUpdates
, aber bevor die Animationen abgeschlossen waren, aufgerufen .Ich habe noch keine gute Lösung gefunden (ohne UITableView). Ich habe mich
performSelector:withObject:afterDelay:
für jetzt entschieden. Nicht ideal, aber erledigt den Job.UPDATE : Es sieht so aus, als könnte ich es
scrollViewDidEndScrollingAnimation:
für diesen Zweck verwenden (dies ist spezifisch für meine Implementierung, siehe Kommentar).quelle
scrollViewDidEndScrollingAnimation
wird nur als Antwort aufsetContentOffset
undscrollRectToVisible
Sie können
tableView:willDisplayCell:forRowAtIndexPath:
wie folgt verwenden :Dies wird jedoch auch aufgerufen, wenn eine Zelle, die sich bereits in der Tabelle befindet, vom Bildschirm auf den Bildschirm verschoben wird, sodass sie möglicherweise nicht genau das ist, wonach Sie suchen. Ich habe gerade alle Methoden
UITableView
undUIScrollView
delegate-Methoden durchgesehen und es scheint nichts zu geben, was zu handhaben ist, nachdem eine Zelle eingefügt wurde.Rufen Sie einfach die Methode auf, die aufgerufen werden soll, wenn die Animation nach dem endet
endUpdates
.quelle
willDisplayCell
es funktionieren wird. Ich brauche es nach der Animation, weil ich erst ein visuelles Update machen muss, nachdem sich alles beruhigt hat.