Mam UITableView, który ma dwa tryby. Kiedy przełączamy się między trybami, mam inną liczbę sekcji i komórek na sekcję. Idealnie byłoby zrobić fajną animację, gdy stół rośnie lub kurczy się.
Oto kod, który próbowałem, ale nic nie robi:
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
[self.tableView reloadData];
[UIView commitAnimations];
Wszelkie przemyślenia na temat tego, jak to zrobić?
cocoa-touch
animation
Vertexwahn
źródło
źródło
_tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)
szybka : W szczególności aktualizuje tylko sekcję 0, która jest domyślną pierwszą sekcją.Możesz użyć:
Cel C
Szybki
Swift 3, 4 i 5
Bez kłopotów. :RE
Możesz także użyć dowolnego z nich
UIViewAnimationOptionTransitions
, aby uzyskać fajniejsze efekty:transitionNone
transitionFlipFromLeft
transitionFlipFromRight
transitionCurlUp
transitionCurlDown
transitionCrossDissolve
transitionFlipFromTop
transitionFlipFromBottom
źródło
[_tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withRowAnimation:UITableViewRowAnimationFade];
Więcej wolności dzięki
CATransition
klasie.Nie ogranicza się to do zanikania, ale może również wykonywać ruchy.
Na przykład:
(nie zapomnij zaimportować
QuartzCore
)Zmień według
type
własnych potrzeb, npkCATransitionFade
.Wdrożenie w Swift:
Odniesienie do CATransition
Swift 5:
źródło
layer
właściwości aUITableViewCell
.Wierzę, że możesz po prostu zaktualizować strukturę danych, a następnie:
Ponadto „withRowAnimation” nie jest dokładnie wartością logiczną, ale stylem animacji:
źródło
Wszystkie te odpowiedzi zakładają, że używasz UITableView z tylko 1 sekcją.
Aby dokładnie obsłużyć sytuacje, w których masz więcej niż 1 sekcję, użyj:
(Uwaga: upewnij się, że masz więcej niż 0 sekcji!)
Inną rzeczą do odnotowania jest to, że możesz napotkać wyjątek NSInternalInconsistencyException, jeśli spróbujesz jednocześnie zaktualizować źródło danych za pomocą tego kodu. W takim przypadku możesz użyć logiki podobnej do tej:
źródło
Podejściem do tego jest nakazanie tableView usunięcia i dodania wierszy i sekcji za pomocą
insertRowsAtIndexPaths:withRowAnimation:
,deleteRowsAtIndexPaths:withRowAnimation:
,insertSections:withRowAnimation:
IdeleteSections:withRowAnimation:
metody UITableView.
Gdy wywołasz te metody, tabela będzie animować / zamykać żądane elementy, a następnie wywołać reloadData na sobie, abyś mógł zaktualizować stan po tej animacji. Ta część jest ważna - jeśli wszystko ożywisz, ale nie zmienisz danych zwróconych przez źródło danych tabeli, wiersze pojawią się ponownie po zakończeniu animacji.
Tak więc przepływ aplikacji byłby następujący:
[self setTableIsInSecondState:YES];
[myTable deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES]];
Tak długo, jak metody dataSource tabeli zwracają poprawny nowy zestaw sekcji i wierszy przez zaznaczenie
[self tableIsInSecondState]
(lub cokolwiek innego), osiągnie to oczekiwany efekt.źródło
Nie mogę skomentować najważniejszej odpowiedzi, ale szybka implementacja to:
możesz dołączyć tyle sekcji, ile chcesz zaktualizować, w pierwszym argumencie argumentu reloadSections.
Inne animacje dostępne z dokumentów: https://developer.apple.com/reference/uikit/uitableviewrowanimation
zanikanie Wstawiony lub usunięty wiersz lub wiersze znikną w widoku tabeli lub z niego.
prawo Wstawiony rząd lub rzędy wsuwają się z prawej strony; usunięty wiersz lub wiersze przesuwają się w prawo.
lewy Wstawiony rząd lub rzędy przesuwają się od lewej; usunięty wiersz lub wiersze przesuwają się w lewo.
góra Wstawiony rząd lub rzędy wsuwają się od góry; usunięty wiersz lub wiersze przesuwają się w górę.
u dołu Wstawiony rząd lub rzędy wsuwają się od dołu; usunięty wiersz lub wiersze przesuwają się w dół.
case none Wstawione lub usunięte wiersze używają domyślnych animacji.
środek Widok tabeli próbuje utrzymać starą i nową komórkę na środku w miejscu, które zrobiły lub zajmą. Dostępne w iPhonie 3.2.
automatyczny Widok tabeli wybiera odpowiedni styl animacji. (Wprowadzone w iOS 5.0.)
źródło
Wersja Swift 4 dla @dmarnel odpowiedź:
źródło
Szybkie wdrożenie:
źródło
Dla Swift 4
źródło
W moim przypadku chciałem dodać 10 dodatkowych wierszy do widoku tabeli (dla funkcji typu „pokaż więcej wyników”) i wykonałem następujące czynności:
W większości przypadków zamiast „self.numberOfRows” zwykle użyjesz liczby obiektów w widoku tabeli. Aby upewnić się, że to rozwiązanie działa dobrze, „arrayOfIndexPaths” musi być dokładną tablicą ścieżek indeksu wstawianych wierszy. Jeśli wiersz istnieje dla którejkolwiek z tych ścieżek indeksu, kod może ulec awarii, dlatego należy użyć metody „reloadRowsAtIndexPaths: withRowAnimation:” dla tych ścieżek indeksu, aby uniknąć awarii
źródło
Jeśli chcesz dodać własne animacje do komórek UITableView, użyj
aby uzyskać tablicę widocznych komórek. Następnie dodaj dowolną niestandardową animację do każdej komórki.
Zapoznaj się z tym, co opublikowałem, aby uzyskać płynną niestandardową animację komórki. https://gist.github.com/floprr/1b7a58e4a18449d962bd
źródło
Animowanie bez reloadData () w Swift można wykonać w następujący sposób (od wersji 2.2):
na wypadek, gdybyś musiał wywołać reloadData () po zakończeniu animacji, możesz uwzględnić zmiany w CATransaction w następujący sposób:
Logika jest pokazana w przypadku usuwania wierszy, ale ten sam pomysł działa również w przypadku dodawania wierszy. Możesz także zmienić animację na UITableViewRowAnimation.Left, aby była schludna, lub wybrać z listy innych dostępnych animacji.
źródło
źródło
.3
dwa razy?Aby ponownie załadować wszystkie sekcje , a nie tylko jedną z niestandardowym czasem trwania .
duration
Parametr użytkownikaUIView.animate
dla ustawienia niestandardowego czasu trwania.źródło
Natywne
UITableView
animacje w SwiftWstawiaj i usuwaj wiersze jednocześnie,
tableView.performBatchUpdates
aby występowały jednocześnie. Opierając się na odpowiedzi z metod @iKenndac, takich jak:tableView.insertSections
tableView.insertRows
tableView.deleteSections
tableView.deleteRows
Dawny:
To wstawia sekcję w pozycji zerowej z animacją ładowaną od góry. Spowoduje to ponowne uruchomienie
cellForRowAt
metody i sprawdzenie, czy w tej pozycji jest nowa komórka. W ten sposób możesz ponownie załadować cały widok tabeli z określonymi animacjami.Re: pytanie OP, flaga warunkowa byłaby potrzebna, aby pokazać komórki dla alternatywnego stanu widoku tabeli.
źródło