Mógłby ktoś powiedzieć mi drogę do wykonywania UITableView
rozszerzalne / składane w animacje sections
od UITableView
jak poniżej?
lub
ios
iphone
uitableview
object
vinnitu
źródło
źródło
Odpowiedzi:
Musisz stworzyć własny, niestandardowy wiersz nagłówka i umieścić go jako pierwszy wiersz każdej sekcji. Podklasy
UITableView
lub nagłówki, które już istnieją, będą uciążliwe. Biorąc pod uwagę sposób, w jaki teraz działają, nie jestem pewien, czy można łatwo uzyskać z nich działania. Możesz ustawić komórkę tak, aby WYGLĄDAŁA jak nagłówek, i ustawićtableView:didSelectRowAtIndexPath
ręczne rozwijanie lub zwijanie sekcji, w której się znajduje.Przechowałbym tablicę wartości logicznych odpowiadających „wydatkom” każdej sekcji. Wtedy można mieć
tableView:didSelectRowAtIndexPath
na każdym z niestandardowych wierszy nagłówka przełącznik tej wartości, a następnie załaduj tę sekcję konkretnego.Następnie ustaw tak,
numberOfRowsInSection
aby sprawdzićmybooleans
wartość i zwrócić 1, jeśli sekcja nie jest rozwinięta, lub 1+ liczbę elementów w sekcji, jeśli jest rozwinięta.Będziesz także musiał zaktualizować,
cellForRowAtIndexPath
aby zwrócić niestandardową komórkę nagłówka dla pierwszego wiersza w dowolnej sekcji.źródło
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
jest lepszym sposobem na zapewnienie własnego „własnego nagłówka”, ponieważ właśnie do tego został zaprojektowany.Przykładowy kod do animowania akcji rozwijania / zwijania za pomocą nagłówka sekcji widoku tabeli jest udostępniany przez firmę Apple tutaj: Animacje i gesty widoku tabeli
Kluczem do tego podejścia jest zaimplementowanie
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
i zwrócenie niestandardowego UIView, który zawiera przycisk (zwykle tego samego rozmiaru co sam widok nagłówka). Podklasując UIView i używając tego dla widoku nagłówka (tak jak w tym przykładzie), można łatwo przechowywać dodatkowe dane, takie jak numer sekcji.źródło
dequeueReusableHeaderFooterViewWithIdentifier
) - kliknij tę strzałkę i przewiń z powrotem do pierwszej gry i spróbuj ją zamknąć -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)Mam fajne rozwiązanie inspirowane animacjami i gestami widoku tabeli Apple . Usunąłem niepotrzebne części z próbki Apple i przetłumaczyłem to na szybkie.
Wiem, że odpowiedź jest dość długa, ale cały kod jest potrzebny. Na szczęście możesz po prostu skopiować i pominąć większość kodu i po prostu dokonać niewielkiej modyfikacji w kroku 1 i 3
1. utwórz
SectionHeaderView.swift
iSectionHeaderView.xib
SectionHeaderView.xib
(widok z szarym tle) powinien wyglądać tak w tableview (można ją dostosować w zależności od potrzeb, oczywiście):Uwaga:
a)
toggleOpen
działanie powinno być powiązanedisclosureButton
b) działania
disclosureButton
itoggleOpen
nie są konieczne. Możesz usunąć te dwie rzeczy, jeśli nie potrzebujesz przycisku.2. tworzyć
SectionInfo.swift
3. w widoku tabeli
źródło
Aby zaimplementować zwijaną sekcję tabeli w iOS, magia polega na tym, jak kontrolować liczbę wierszy dla każdej sekcji lub możemy zarządzać wysokością wierszy dla każdej sekcji.
Musimy również dostosować nagłówek sekcji, abyśmy mogli słuchać zdarzenia tap z obszaru nagłówka (niezależnie od tego, czy jest to przycisk, czy cały nagłówek).
Jak sobie radzić z nagłówkiem? To bardzo proste, rozszerzamy klasę UITableViewCell i tworzymy niestandardową komórkę nagłówka w następujący sposób:
następnie użyj viewForHeaderInSection, aby podłączyć komórkę nagłówka:
pamiętaj, że musimy zwrócić contentView, ponieważ ta funkcja oczekuje zwrócenia UIView.
Teraz zajmijmy się składaną częścią, oto funkcja przełączania, która przełącza zwijaną rekwizyt każdej sekcji:
zależy od tego, jak zarządzasz danymi sekcji, w tym przypadku mam dane sekcji mniej więcej tak:
w końcu to, co musimy zrobić, opiera się na zwijanym rekwizycie każdej sekcji, kontroluje liczbę wierszy tej sekcji:
Mam w pełni działające demo na moim Githubie: https://github.com/jeantimex/ios-swift-collapsible-table-section
Jeśli chcesz zaimplementować zwijane sekcje w tabeli w stylu zgrupowanym, mam inne demo z kodem źródłowym tutaj: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
Mam nadzieję, że to pomoże.
źródło
Mam lepsze rozwiązanie, że powinieneś dodać przycisk UIButton do nagłówka sekcji i ustawić rozmiar tego przycisku na równy rozmiarowi sekcji, ale ukryj go za pomocą przezroczystego koloru tła, po czym możesz łatwo sprawdzić, która sekcja jest kliknięta, aby rozwinąć lub zwinąć
źródło
tableView:numberOfRowsInSection:
pozostanie nietknięta i nadal będziesz mógł jej używać do tego, co naprawdę oznacza. To samo dotyczytableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
i dodajesection
właściwość oraz definiuje a,SectionHeaderViewDelegate
który zapewnia wywołanie zwrotne w celu otwarcia / zamknięcia sekcji. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/ ... )Skończyło się na utworzeniu widoku headerView, który zawierał przycisk ( po fakcie widziałem powyżej rozwiązanie Son Nguyen , ale oto mój kod ... wygląda na dużo, ale jest całkiem prosty):
zadeklaruj kilka wartości dla swoich sekcji
...kod
teraz w metodach delegata tableview ...
i wreszcie funkcja, która jest wywoływana po dotknięciu jednego z przycisków nagłówka sekcji:
źródło
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
w metodzie collapse / uncollapse, powinno to ładnie się animować.To najlepszy sposób, jaki znalazłem na tworzenie komórek z rozszerzalnym widokiem tabeli
plik .h
plik .m
Metody delegatów widoku tabeli
źródło
Tak więc, w oparciu o rozwiązanie `` przycisk w nagłówku '', oto czysta i minimalistyczna implementacja:
Oto kod:
źródło
Znalazłem inny stosunkowo prosty sposób rozwiązania tego problemu. Korzystając z tej metody, nie będziemy musieli zmieniać naszej komórki, która prawie zawsze jest związana z indeksem tablicy danych, potencjalnie powodując bałagan w naszym kontrolerze widoku.
Najpierw dodajemy następujące właściwości do naszej klasy kontrolera:
collapsedSections
zapisze zwinięte numery sekcji.sectionViews
zapisze nasz niestandardowy widok przekroju.Zsyntetyzuj to:
Zainicjuj to:
Następnie musimy połączyć nasz UITableView, aby można było uzyskać do niego dostęp z poziomu naszej klasy kontrolera widoku:
Podłącz go z XIB, aby wyświetlić kontroler używając
ctrl + drag
jak zwykle.Następnie tworzymy widok jako niestandardowy nagłówek sekcji dla naszego widoku tabeli, implementując tego delegata UITableView:
Następnie implementujemy metodę zapisywania utworzonego wcześniej niestandardowego nagłówka sekcji we właściwości klasy:
Dodaj
UIGestureRecognizerDelegate
do naszego pliku .h kontrolera widoku:Następnie tworzymy metodę
attachTapGestureToView:
Powyższa metoda doda rozpoznawanie gestów dotknięcia do całego widoku przekroju, który utworzyliśmy wcześniej. Następnie należy zaimplementować
onTap:
selectorPowyższa metoda zostanie wywołana, gdy użytkownik dotknie jednej z naszych sekcji widoku tabeli. Ta metoda wyszukuje poprawny numer sekcji na podstawie naszej
sectionViews
tablicy, którą utworzyliśmy wcześniej.Zaimplementowaliśmy również metodę pobierania, do której należy sekcja widoku nagłówka.
Następnie musimy zaimplementować metodę
toggleCollapseSection:
Ta metoda wstawi / usunie numer sekcji do naszej
collapsedSections
tablicy, którą utworzyliśmy wcześniej. Gdy numer sekcji zostanie wstawiony do tej tablicy, oznacza to, że sekcja powinna zostać zwinięta i rozwinięta, jeśli jest inaczej.Następnie wdrożyć
removeCollapsedSection:
,addCollapsedSection:section
aisCollapsedSection:section
Te trzy metody są tylko pomocnikami, które ułatwiają nam dostęp do
collapsedSections
tablicy.Na koniec zaimplementuj tego delegata widoku tabeli, aby nasze niestandardowe widoki sekcji wyglądały ładnie.
Mam nadzieję, że to pomoże.
źródło
Użyłem NSDictionary jako źródła danych, wygląda to na dużo kodu, ale jest naprawdę prosty i działa bardzo dobrze! jak tu wygląda
Utworzyłem wyliczenie dla sekcji
właściwość sekcji:
Metoda zwracająca moje sekcje:
A następnie skonfiguruj moje źródło danych:
Kolejne metody pomogą ci dowiedzieć się, kiedy sekcja jest otwarta i jak odpowiedzieć na źródło danych widoku tabeli:
Odpowiedz w sekcji na źródło danych:
Przybory:
Przełącz widoczność sekcji
źródło
// vKj
źródło
// vKj
źródło
Rozwijając tę odpowiedź napisaną w celu C, napisałem następujące informacje dla osób piszących w języku Swift
Chodzi o to, aby użyć sekcji w tabeli i ustawić liczbę wierszy w sekcji na 1 (zwinięty) i 3 (rozwinięty), gdy pierwszy wiersz w tej sekcji zostanie dotknięty
Tabela decyduje o liczbie wierszy do narysowania na podstawie tablicy wartości logicznych
Musisz utworzyć dwa wiersze w scenorysie i nadać im identyfikatory ponownego użycia „CollapsingRow” i „GroupHeading”
źródło
Pewien przykładowy kod do animowania akcji rozwijania / zwijania przy użyciu nagłówka sekcji widoku tabeli jest udostępniany przez firmę Apple w sekcji Animacje i gesty widoku tabeli .
Kluczem do tego podejścia jest wdrożenie
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
i zwróć niestandardowy widok UIView, który zawiera przycisk (zazwyczaj taki sam rozmiar jak sam widok nagłówka). Podklasując UIView i używając tego dla widoku nagłówka (tak jak w tym przykładzie), można łatwo przechowywać dodatkowe dane, takie jak numer sekcji.
źródło
Zrobiłem to samo, używając wielu sekcji.
źródło
Dodam to rozwiązanie dla kompletności i pokazując, jak pracować z nagłówkami sekcji.
Link do sedna: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
źródło
w celu wsparcia rozwiązania @ jean.timex, użyj poniższego kodu, jeśli chcesz otworzyć jedną sekcję w dowolnym momencie. utwórz zmienną taką jak: var extendedSection = -1;
źródło