Używam UITableView
do układu „stron” zawartości. Używam nagłówków widoku tabeli do układania niektórych obrazów itp. I wolałbym, aby nie były ruchome, ale pozostawały statyczne, tak jak robią to, gdy styl jest ustawiony na UITableViewStyleGrouped
.
UITableViewStyleGrouped
Czy można to zrobić inaczej niż przy użyciu ? Chciałbym uniknąć używania grupowania, ponieważ dodaje margines w dół wszystkich moich komórek i wymaga wyłączenia widoku tła dla każdej z komórek. Chciałbym mieć pełną kontrolę nad moim układem. Idealnie byłoby, gdyby były to „UITableViewStyleBareBones”, ale nie widziałem tej opcji w dokumentach ...
Wielkie dzięki,
ios
objective-c
iphone
cocoa-touch
uikit
Zdradliwy
źródło
źródło
Odpowiedzi:
Powinieneś móc to sfałszować, używając niestandardowej komórki do tworzenia wierszy nagłówka. Będą one następnie przewijane jak każda inna komórka w widoku tabeli.
Wystarczy dodać trochę logiki,
cellForRowAtIndexPath
aby zwrócić właściwy typ komórki, gdy jest to wiersz nagłówka.Prawdopodobnie będziesz musiał sam zarządzać swoimi sekcjami, tj. Mieć wszystko w jednej sekcji i sfałszować nagłówki. (Możesz także spróbować zwrócić ukryty widok dla widoku nagłówka, ale nie wiem, czy to zadziała)
źródło
Prawdopodobnie łatwiejszy sposób na osiągnięcie tego:
Cel C:
Szybki:
Nagłówki sekcji będą teraz przewijać się jak każda zwykła komórka.
źródło
(Dla każdego, kto kiedykolwiek tu trafił z powodu złego stylu tabeli) Zmień styl tabeli z prostego na zgrupowany, za pomocą inspektora atrybutów lub kodu:
źródło
TableView Style
właściwość można znaleźć również w atrybucie AttributesInspector.UWAGA : to rozwiązanie implementuje zarezerwowaną metodę API. Może to uniemożliwić zatwierdzenie aplikacji przez Apple do dystrybucji w AppStore.
Opisałem metody prywatne, które zmieniają nagłówki sekcji w moim blogu
Zasadniczo wystarczy podklasować
UITableView
i powrócićNO
w dwóch z jego metod:źródło
Ok, wiem, że jest późno, ale musiałem to zrobić. Spędziłem już 10 godzin na poszukiwaniu działającego rozwiązania, ale nie znalazłem pełnej odpowiedzi. Znalazłem kilka wskazówek, ale początkujących było trudnych do zrozumienia. Musiałem więc włożyć moje 2 centy i uzupełnić odpowiedź.
Jak zasugerowano w kilku odpowiedziach, jedynym działającym rozwiązaniem, które udało mi się zaimplementować, jest wstawienie normalnych komórek do widoku tabeli i traktowanie ich jako nagłówków sekcji, ale lepszym sposobem na osiągnięcie tego jest wstawienie tych komórek w wiersz 0 każdej sekcji. W ten sposób możemy bardzo łatwo obsłużyć te niestandardowe niepływające nagłówki.
Tak więc kroki są.
Zaimplementuj UITableView ze stylem UITableViewStylePlain.
Zaimplementuj titleForHeaderInSection jak zwykle (możesz uzyskać tę wartość za pomocą własnej logiki, ale ja wolę używać standardowych delegatów).
Immplement numberOfSectionsInTableView jak zwykle
Zaimplementuj numberOfRowsInSection w zwykły sposób.
Zwróć 0,0f w heightForHeaderInSection.
NIE implementuj viewForHeaderInSection. Całkowicie usuń metodę zamiast zwracać nil.
In heightForRowAtIndexPath. Sprawdź, czy (indexpath.row == 0) i zwróć żądaną wysokość komórki dla nagłówka sekcji, w przeciwnym razie zwróć wysokość komórki.
Teraz w cellForRowAtIndexPath sprawdź, czy (indexpath.row == 0) i zaimplementuj komórkę tak, jak chcesz, aby nagłówek sekcji był i ustaw styl zaznaczenia na none. INNYM zaimplementuj komórkę tak, jak chcesz, aby była normalna komórka.
Teraz zaimplementuj willSelectRowAtIndexPath i zwróć nil, jeśli indexpath.row == 0. Będzie to obchodziło, że didSelectRowAtIndexPath nigdy nie zostanie wywołany dla wiersza nagłówka sekcji.
Na koniec w didSelectRowAtIndexPath sprawdź, czy (indexpath.row! = 0) i kontynuuj.
Z tym jesteś gotowy. Masz teraz doskonale przewijający się, niepływający nagłówek sekcji.
źródło
W programie Interface Builder kliknij widok tabeli problemu
Następnie przejdź do Attributes Inspector i zmień Style Plain na Grouped;) Easy
źródło
Interesującą rzeczą dotyczącą UITableViewStyleGrouped jest to, że tableView dodaje styl do komórek a nie do TableView.
Styl jest dodawany jako backgroundView do komórek jako klasa o nazwie UIGroupTableViewCellBackground, która obsługuje rysowanie innego tła w zależności od położenia komórki w sekcji.
Tak więc bardzo prostym rozwiązaniem będzie użycie UITableViewStyleGrouped, ustawienie backgroundColor tabeli na clearColor i po prostu zastąpienie backgroundView komórki w cellForRow:
źródło
Zmień styl TableView:
Zgodnie z dokumentacją Apple dla UITableView:
źródło
Jest inny trudny sposób. Głównym pomysłem jest podwojenie numeru sekcji, a pierwsza pokazuje tylko headerView, podczas gdy druga pokazuje rzeczywiste komórki.
Trzeba wtedy zaimplementować delegatów headerInSection:
To podejście ma również niewielki wpływ na źródła danych:
W porównaniu z innymi podejściami, ten sposób jest bezpieczny bez zmiany ramki lub zawartości zestawów widoku tabeli. Mam nadzieję, że to może pomóc.
źródło
Najłatwiejszym sposobem uzyskania tego, czego chcesz, jest ustawienie stylu tabeli jako
UITableViewStyleGrouped
, styl separatora jakoUITableViewCellSeparatorStyleNone
:Nie próbuj zwracać widoku stopki jako
nil
, nie zapomnij ustawić wysokości nagłówka i widoku nagłówka, po tym, jak musisz uzyskać to, czego chcesz.źródło
Chociaż może to nie rozwiązać twojego problemu, zrobiło to dla mnie, gdy chciałem zrobić podobną rzecz. Zamiast ustawiania nagłówka użyłem stopki z powyższej sekcji. Uratowało mnie to, że ta sekcja była mała i statyczna, więc nigdy nie przewijała się poniżej dolnej części widoku.
źródło
Dla Swift 3+
Po prostu użyj
UITableViewStyleGrouped
i ustaw wysokość stopki na zero, wykonując następujące czynności:źródło
.leastNormalMagnitude
. Musisz także wdrożyćtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
tym przypadku nie jest też konieczne implementowanie funkcji.0
i.leastNormalMagnitude
miał ten sam efekt. WdrożenieviewForFooterSection
metody jest konieczne. Powinieneś zwrócić zero. To jest w Swift 5.1 z Xcode 11.3.1.Zastanawiając się, jak podejść do tego problemu, przypomniałem sobie bardzo ważny szczegół dotyczący UITableViewStyleGrouped. Sposób, w jaki UITableView implementuje zgrupowany styl (zaokrąglone obramowania wokół komórek), polega na dodaniu niestandardowego backgroundView do UITableViewCells, a nie do UITableView. Do każdej komórki dodaje się backgroundView zgodnie z jej pozycją w sekcji (górne wiersze otrzymują górną część obramowania sekcji, środkowe otrzymują krawędź boczną, a dolne - cóż, dolną część). Tak więc, jeśli chcemy tylko prostego stylu i nie mamy niestandardowego widoku tła dla naszych komórek (co ma miejsce w 90% przypadków), wszystko, co musimy zrobić, to użyć UITableViewStyleGrouped i usunąć niestandardowe tło . Można to zrobić, wykonując te dwa kroki:
Zmień nasz styl tableView na UITableViewStyleGrouped Dodaj następujący wiersz do cellForRow, tuż przed zwróceniem komórki:
cell.backgroundView = [[[UIView assign] initWithFrame: cell.bounds] autorelease];
I to wszystko. Styl tableView stanie się dokładnie taki sam, jak UITableViewStylePlain, z wyjątkiem pływających nagłówków.
Mam nadzieję że to pomoże!
źródło
Może mógłbyś użyć
scrollViewDidScroll
na tableView i zmienićcontentInset
podstawie aktualnie widocznego nagłówka.Wydaje się, że działa w moim przypadku użycia!
źródło
Innym sposobem na zrobienie tego jest zrobienie pustej sekcji tuż przed tą, w której chcesz umieścić nagłówek, i umieszczenie nagłówka w tej sekcji. Ponieważ sekcja jest pusta, nagłówek przewinie się natychmiast.
źródło
Możesz dodać jedną sekcję (z zerowymi wierszami) powyżej, a następnie ustawić powyższą sekcję sectionFooterView jako headerView bieżącej sekcji, footerView nie jest zmienna. Mam nadzieję, że to pomoże.
źródło
Ignoruj XAK. Nie korzystaj z prywatnych metod, jeśli chcesz, aby Twoja aplikacja miała szansę zostać zaakceptowana przez Apple.
Jest to najłatwiejsze, jeśli używasz programu Interface Builder. Dodałbyś UIView w górnej części widoku (gdzie trafią obrazy), a następnie dodaj widok tabeli poniżej. IB powinien go odpowiednio dopasować; to znaczy, że górna część widoku tabeli dotyka dołu właśnie dodanego UIView, a jego wysokość obejmuje pozostałą część ekranu.
Myślenie tutaj jest takie, że jeśli ten UIView nie jest w rzeczywistości częścią widoku tabeli, nie będzie przewijał się z widokiem tabeli. tj. zignoruj nagłówek tableview.
Jeśli nie używasz konstruktora interfejsu, jest to trochę bardziej skomplikowane, ponieważ musisz uzyskać prawidłowe położenie i wysokość dla widoku tabeli.
źródło
Sprawdź odpowiedź, jak zaimplementować nagłówki w StoryBoard: nagłówków tabeli w StoryBoards
Zauważ też, że jeśli nie zaimplementujesz
nie będzie się unosić, co jest dokładnie tym, czego chcesz.
źródło
Aby całkowicie usunąć swobodne sekcje nagłówka sekcji, możesz to zrobić:
return nil
nie działa.Aby wyłączyć ruchome, ale nadal wyświetlać nagłówki sekcji, możesz zapewnić widok niestandardowy z jego własnymi zachowaniami.
źródło
Odmiana rozwiązania @ samvermette:
źródło
Fragment wyświetla przyklejony nagłówek tylko dla pierwszej sekcji. Inne nagłówki sekcji będą pływać z komórkami.
źródło
Można to osiągnąć, przypisując widok nagłówka ręcznie w metodzie viewDidLoad UITableViewControllera zamiast używania viewForHeaderInSection i heightForHeaderInSection delegata. Na przykład w Twojej podklasie UITableViewController możesz zrobić coś takiego:
Widok nagłówka zniknie wtedy, gdy użytkownik przewinie. Nie wiem, dlaczego to działa w ten sposób, ale wydaje się, że osiąga to, czego szukasz.
źródło
Może możesz po prostu ustawić przezroczyste tło widoku nagłówka:
Lub zastosuj globalnie:
źródło
Mam inne, jeszcze prostsze rozwiązanie, do użycia bez autoukładu i ze wszystkim wykonanym przez XIB:
1 / Umieść nagłówek w widoku tabeli, przeciągając go i upuszczając bezpośrednio w widoku tabeli.
2 / W Inspektorze rozmiaru nowo utworzonego nagłówka, po prostu zmień jego autodopasowanie: powinieneś pozostawić tylko górną, lewą i prawą kotwicę oraz wypełnienie w poziomie.
To powinno załatwić sprawę!
źródło
Zgodnie z odpowiedzią @ samvermette , Powyższy kod zaimplementowałem w języku Swift, aby ułatwić programistom korzystanie z niego.
źródło
ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Pomogło to wykorzystać przestrzeń nagłówka
źródło
Najnowsza aktualizacja 2020
Przetestowano za pomocą Xcode 14.
Aby ukryć dowolny nagłówek sekcji, Zwróć nil jako tytuł delegata sekcji
źródło
można to łatwo osiągnąć, implementując metodę viewForHeaderInSection w klasie delegata tableview. ta metoda oczekuje UIView jako obiektu zwracanego (który jest widokiem nagłówka). zrobiłem to samo w swoim kodzie
źródło