Znalazłem NAPRAWDĘ PROSTE rozwiązanie tego efektu ubocznego, nad którym UITableView
pracowałem .....
Przechowuj wysokość komórki w zmiennej, która normalnie zgłasza pierwotną wysokość tableView: heightForRowAtIndexPath:
, a kiedy chcesz animować zmianę wysokości, po prostu zmień wartość zmiennej i wywołaj to ...
[tableView beginUpdates];
[tableView endUpdates];
Przekonasz się, że nie wykonuje pełnego przeładowania, ale wystarczy, UITableView
aby wiedzieć, że musi przerysować komórki, chwytając nową wartość wysokości komórki ... i zgadnij co? ANIMUJE zmianę dla Ciebie. Słodkie.
Na blogu mam bardziej szczegółowe objaśnienia i pełne przykłady kodu ... Animacja zmiany wysokości komórki UITableView
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…Podoba mi się odpowiedź Simona Lee. Właściwie nie wypróbowałem tej metody, ale wygląda na to, że zmieniłby rozmiar wszystkich komórek na liście. Miałem nadzieję na zmianę tylko podsłuchiwanej komórki. Zrobiłem to trochę jak Simon, ale z niewielką różnicą. Spowoduje to zmianę wyglądu komórki po jej wybraniu. I to animuje. Po prostu inny sposób na zrobienie tego.
Utwórz int, aby przechowywać wartość dla bieżącego wybranego indeksu komórki:
Następnie:
Następnie:
Jestem pewien, że możesz dokonać podobnych zmian w tableView: cellForRowAtIndexPath: aby zmienić typ komórki lub nawet załadować plik xib dla komórki.
W ten sposób currentSelection rozpocznie się od 0. Jeśli nie chcesz, aby pierwsza komórka listy (o indeksie 0) domyślnie wyglądała na wybraną, musisz ją wprowadzić.
źródło
Dodaj właściwość, aby śledzić wybraną komórkę
Ustaw wartość wartownika w (na przykład)
viewDidLoad
, aby upewnić się, żeUITableView
zaczyna się w pozycji „normalnej”W
heightForRowAtIndexPath
możesz ustawić żądaną wysokość dla wybranej komórkiW
didSelectRowAtIndexPath
zapisz bieżący wybór i zapisz dynamiczną wysokość, jeśli to konieczneW
didDeselectRowAtIndexPath
ustawienia tyłem do wyboru wskaźnika wartości wskaźnikowych i ożywić komórek z powrotem do normalnej postaciźródło
reloadData nie jest dobra, ponieważ nie ma animacji ...
Właśnie tego próbuję obecnie:
To prawie działa poprawnie. Prawie. Zwiększam wysokość komórki, a czasami w widoku tabeli pojawia się mały „czkawka”, gdy komórka jest zastępowana, tak jakby zachowane zostało pewne przewijane położenie w widoku tabeli, nowa komórka (która jest pierwszą komórką w tabeli) kończy się zbyt dużym przesunięciem, a widok przewijania podskakuje, aby zmienić jego położenie.
źródło
Nie wiem, co to wszystko o wywoływaniu beginUpdates / endUpdates po kolei, możesz po prostu użyć
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Oto przykładowy projekt .źródło
Rozwiązałem z
reloadRowsAtIndexPaths
.Zapisać się
didSelectRowAtIndexPath
do wybranej komórki indexPath i rozmowyreloadRowsAtIndexPaths
na końcu (można wysłać NSMutableArray na liście elementu chcesz reload).W
heightForRowAtIndexPath
możesz sprawdzić, czy indeksPath znajduje się na liście, czy nie w komórce expandIndexPath i wysłać wysokość.Możesz sprawdzić ten podstawowy przykład: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam To proste rozwiązanie.
dodaję kod, jeśli ci pomogę
źródło
Zamiast
beginUpdates()
/endUpdates()
zalecanym połączeniem jest teraz:W odniesieniu do beginUpdates / endUpdates Apple mówi: „Używaj metody performBatchUpdates (_: complete :) zamiast tej, jeśli to możliwe.”
Zobacz: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
źródło
Spróbuj wykonać to w celu rozwinięcia wiersza indeksowanego:
źródło
źródło
tylko notatkę dla kogoś takiego jak ja szukającego dodania „Więcej szczegółów” w komórce niestandardowej.
Wykonał świetną pracę, ale nie zapomnij „przyciąć” widoku komórki. Od konstruktora Interface zaznaczyć komórki -> Wyświetlanie treści -> z Inspektora właściwości wybierz „ klip podrzędny ”
źródło
Oto krótsza wersja odpowiedzi Simonsa dla Swift 3. Pozwala również na przełączanie wyboru komórki
źródło
Swift 4 i wyżej
dodaj poniższy kod do swojej metody delegowania wiersza w widoku tabeli
źródło
Szybka wersja odpowiedzi Simona Lee.
Następnie w didSelectRowAtIndexPath ()
źródło
Tak, to możliwe.
UITableView
ma metodę delegowaniadidSelectRowAtIndexPath
Ale w twoim przypadku, jeśli użytkownik przewinie i wybierze inną komórkę, musisz mieć ostatnią wybraną komórkę, aby zmniejszyć i rozwinąć aktualnie wybrane
reloadRowsAtIndexPaths:
połączenia komórkowe,heightForRowAtIndexPath:
więc odpowiednio postępuj.źródło
Oto mój kod niestandardowej
UITableView
podklasy, która rozwija sięUITextView
w komórce tabeli, bez ponownego ładowania (i utraty skupienia klawiatury):źródło
Użyłem niesamowitej odpowiedzi @ Joy, która zadziałała doskonale w systemie iOS 8.4 i XCode 7.1.1.
Jeśli chcesz, aby Twoja komórka mogła się przełączać, zmieniłem -tableViewDidSelect na następujące:
Mam nadzieję, że coś z tego pomogło.
źródło
Sprawdź tę metodę po iOS 7 i nowszych.
Ulepszenia wprowadzono w iOS 8. Możemy ustawić go jako właściwość samego widoku tabeli.
źródło
Szybka wersja odpowiedzi Simona Lee :
Należy pamiętać, że należy zmienić właściwości wysokości PRZED
endUpdates()
.źródło
Wejścia -
tableView.beginUpdates () tableView.endUpdates () te funkcje nie będą wywoływane
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Ale jeśli to zrobisz, tableView.reloadRows (at: [selectedIndexPath! As IndexPath], z: .none)
Będzie ona wywołać tableView funkcjono (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} funkcja.
źródło
Właśnie rozwiązałem ten problem za pomocą małego włamania:
Kiedy muszę zwiększyć wysokość komórki, ustawiam
isInEdit = YES
i[self onTimer]
wywołuję metodę, która animuje wzrost komórki, aż osiągnie wartość s_CellHeightEditing :-)źródło
Uzyskaj ścieżkę indeksu wybranego wiersza. Załaduj ponownie stół. W metodzie heightForRowAtIndexPath metody UITableViewDelegate ustaw wysokość wybranego wiersza na inną wysokość, a dla innych zwróć normalną wysokość wiersza
źródło
[table reloadData]
powoduje natychmiastową zmianę wysokości, a nie animację.