Wstawiam / usuwam komórkę tabeli za pomocą insertRowsAtIndexPaths/deleteRowsAtIndexPaths
zawiniętej beginUpdates/endUpdates
. Używam również beginUpdates/endUpdates
podczas dostosowywania rowHeight. Wszystkie te operacje są domyślnie animowane.
Jak mogę wykryć, że animacja zakończyła się podczas używania beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
źródło
źródło
-scrollToRowAtIndexPath:atScrollPosition:animated:
również.Odpowiedzi:
A co z tym?
Działa to, ponieważ animacje tableView używają
CALayer
animacji wewnętrznie. Oznacza to, że dodają animacje do każdego otwartegoCATransaction
. Jeśli nieCATransaction
istnieje żaden otwarty (normalny przypadek), to jest niejawnie rozpoczynany, który kończy się na końcu bieżącego pętli. Ale jeśli sam zaczniesz, tak jak tutaj, to użyje tego.źródło
completionBlock
przedbeginUpdates
iendUpdates
jak we fragmencie?[CATransaction commit]
należy wywołać po nie wcześniej[tableView endUpdates]
.Szybka wersja
źródło
Jeśli celujesz w system iOS 11 lub nowszy,
UITableView.performBatchUpdates(_:completion:)
zamiast tego użyj :źródło
Możliwym rozwiązaniem może być dziedziczenie z UITableView, na którym wywołujesz
endUpdates
i zastępujesz gosetContentSizeMethod
, ponieważ UITableView dostosowuje rozmiar zawartości, aby pasował do dodanych lub usuniętych wierszy. To podejście powinno również działać w przypadkureloadData
.Aby mieć pewność, że powiadomienie zostanie wysłane dopiero po
endUpdates
wywołaniu, można również nadpisaćendUpdates
i ustawić tam flagę.źródło
Możesz ująć swoje operacje w bloku animacji UIView w następujący sposób:
Kredyty na https://stackoverflow.com/a/12905114/634940 .
źródło
endUpdates
, ale przed zakończeniem animacji.Nie znalazłem jeszcze dobrego rozwiązania (bez podklasy UITableView). Postanowiłem na razie użyć
performSelector:withObject:afterDelay:
. Nie jest idealny, ale wykonuje swoją pracę.AKTUALIZACJA : Wygląda na to, że mogę użyć
scrollViewDidEndScrollingAnimation:
do tego celu (jest to specyficzne dla mojej implementacji, patrz komentarz).źródło
scrollViewDidEndScrollingAnimation
jest wywoływany tylko w odpowiedzi nasetContentOffset
iscrollRectToVisible
Możesz użyć
tableView:willDisplayCell:forRowAtIndexPath:
takich jak:Ale zostanie to również wywołane, gdy komórka, która już znajduje się w tabeli, przesunie się z ekranu poza ekran do ekranu, więc może nie być dokładnie tym, czego szukasz. Właśnie przejrzałem wszystkie
UITableView
iUIScrollView
delegate i wydaje się, że nie ma nic do obsłużenia zaraz po wstawieniu komórki do animacji.Dlaczego po prostu nie wywołać metody, którą chcesz wywołać, gdy animacja zakończy się po
endUpdates
?źródło
willDisplayCell
że zadziała. Potrzebuję, aby stało się to po animacji, ponieważ muszę dokonać aktualizacji wizualnej tylko wtedy, gdy wszystko się ułoży.