Czy istnieje sposób na dodanie odstępów między UITableViewCell
?
Utworzyłem tabelę, a każda komórka zawiera tylko obraz. Obraz jest przypisywany do komórki w następujący sposób:
cell.imageView.image = [myImages objectAtIndex:indexPath.row];
ale to sprawia, że obraz jest powiększany i dopasowywany do całej komórki, a między obrazami nie ma odstępów.
Albo powiedzmy w ten sposób, wysokość obrazu to np. 50, a ja chcę dodać 20 odstępów między obrazami. Czy jest jakiś sposób, aby to osiągnąć?
ios
objective-c
uitableview
saili
źródło
źródło
Odpowiedzi:
Szybka wersja
Zaktualizowano dla Swift 3
Ta odpowiedź jest nieco bardziej ogólna niż pierwotne pytanie ze względu na przyszłych widzów. Jest to przykład uzupełniający do podstawowego przykładu UITableView dla języka Swift .
Przegląd
Podstawowym pomysłem jest utworzenie nowej sekcji (zamiast nowego wiersza) dla każdego elementu tablicy. Sekcje można następnie rozstawić na podstawie wysokości nagłówka sekcji.
Jak to zrobić
Skonfiguruj projekt zgodnie z opisem w przykładzie UITableView dla języka Swift . (Oznacza to, że należy dodać
UITableView
i podłączyćtableView
wylot do kontrolera widoku).W programie Interface Builder zmień kolor tła widoku głównego na jasnoniebieski, a
UITableView
kolor tła na wyczyść.Zastąp kod ViewController.swift następującym.
ViewController.swift
Zauważ, że
indexPath.section
jest on używany raczej niżindexPath.row
w celu uzyskania odpowiednich wartości dla elementów tablicy i pozycji zaczepów.Jak uzyskałeś dodatkowe wypełnienie / przestrzeń po prawej i lewej stronie?
Mam to w ten sam sposób, w jaki dodajesz odstępy do dowolnego widoku. Użyłem ograniczeń układu automatycznego. Po prostu użyj narzędzia pinezki w Interface Builder, aby dodać odstępy dla wiodących i końcowych ograniczeń.
źródło
numberOfSectionsInTableView
ireturn 1
dla liczby wierszy. Następnie użyj,indexPath.section
aby uzyskać bieżący indeks komórki. Spróbuj raz. Myślę, że odkryjesz, że nie musisz wprowadzać zbyt wielu zmian w swojej obecnej konfiguracji. Jest to zdecydowanie łatwiejsze niż tworzenie podklas.layer
manipulacje są dość szybkie. Czy mówisz to, ponieważ zauważyłeś hit wydajnościowy, czy jako ogólną dobrą praktykę? Nawet jeśli ustawisz je w XIB, nadal muszą być ustawione podczas tworzenia komórki.Moje proste rozwiązanie przy użyciu Swift :
Wynik
źródło
super.layoutSubviews()
najpierw zadzwonić, aby upewnić się, że cały widok został prawidłowo rozplanowany przed ustawieniem ramki.didSet
dlaselected
zmiennej i połączeńlayoutSubviews()
wewnątrz!Sposobem dodawania odstępów między komórkami jest ustawienie numberOfSections = "Twoja liczba tablic" i sprawienie, że każda sekcja zawiera tylko jeden wiersz. Następnie zdefiniuj headerView i jego wysokość.
źródło
Musiałem zastosować tę samą koncepcję, aby komórki UITableCell miały „przestrzeń” między nimi. Ponieważ nie możesz dosłownie dodać spacji między komórkami, możesz to sfałszować, manipulując wysokością komórki UITableView, a następnie dodając UIView do contentView swojej komórki. Oto zrzut ekranu prototypu, który wykonałem w innym projekcie testowym, kiedy to symulowałem:
Oto kod (uwaga: istnieje wiele wartości zakodowanych na stałe do celów demonstracyjnych)
Najpierw musiałem ustawić,
heightForRowAtIndexPath
aby zezwolić na różne wysokości w UITableViewCell.Następnie chcę manipulować wyglądem i działaniem UITableViewCells, więc robię to w
willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
metodzie.Zwróć uwagę, że zrobiłem mój whiteRoundedCornerView wysokość 70,0 i to właśnie powoduje symulowaną przestrzeń, ponieważ wysokość komórki wynosi w rzeczywistości 80,0, ale mój contentView to 70,0, co nadaje mu wygląd.
Mogą istnieć inne sposoby na osiągnięcie tego jeszcze lepiej, ale właśnie tak znalazłem, jak to zrobić. Mam nadzieję, że pomoże to komuś innemu.
źródło
Będziesz musiał ustawić ramkę do swojego obrazu. Niesprawdzony kod to
źródło
layoutSubviews
jeśli tworzysz podklasyUITableViewCell
UITableViewCell
, aby uzyskać wynik, którego potrzebuję :) ... PodklasyUITableViewCell
są bardzo powszechne.UITableViewCell
. Podczas tworzenia niestandardowychUITableViewCells
należy tworzyć podklasyUITableViewCell
.Byłem na tej samej łodzi. Na początku próbowałem przejść do sekcji, ale w moim przypadku okazało się, że przyprawiło to o ból głowy bardziej, niż początkowo sądziłem, więc szukałem alternatywy. Aby nadal używać wierszy (i nie mieszać w sposobie uzyskiwania dostępu do danych modelu), oto co zadziałało dla mnie po prostu przy użyciu maski :
Pozostało tylko zwiększyć wysokość komórki o taką samą wartość, jak żądana
verticalPadding
, a następnie zmodyfikować układ wewnętrzny, aby wszystkie widoki, które miały odstępy od krawędzi komórki, miały ten sam odstęp zwiększony overticalPadding/2
. Drobna wada:verticalPadding/2
dopełnienie uzyskuje się zarówno u góry, jak iu dołu tableView, ale można to szybko naprawić, ustawiająctableView.contentInset.bottom = -verticalPadding/2
itableView.contentInset.top = -verticalPadding/2
. Mam nadzieję, że to komuś pomoże!źródło
Myślę, że najprostszym rozwiązaniem, jeśli szukasz tylko trochę miejsca i prawdopodobnie najmniej kosztownego, byłoby po prostu ustawienie koloru obramowania komórki na kolor tła tabel, a następnie ustawienie szerokości obramowania, aby uzyskać pożądany efekt!
źródło
Jeśli nie używasz jeszcze nagłówków (lub stopek) sekcji, możesz ich użyć, aby dodać dowolne odstępy do komórek tabeli. Zamiast mieć jedną sekcję z n wierszami, utwórz tabelę z n sekcjami z jednym wierszem w każdej.
Zaimplementuj
tableView:heightForHeaderInSection:
metodę, aby kontrolować odstępy.Możesz również chcieć zaimplementować,
tableView:viewForHeaderInSection:
aby kontrolować wygląd odstępów.źródło
Rozwiązałem to w ten sposób w Swift 4.
Tworzę rozszerzenie UITableViewCell i dołączam ten kod:
Mam nadzieję, że Ci to pomoże.
źródło
Przykład w Swift 3 ..
Wyświetl kod kontrolera poniżej
func numberOfSections (in tableView: UITableView) -> Int {return arraytable.count}
Pobierz pełne źródło na Github: link
https://github.com/enamul95/CustomSectionTable
źródło
Trzy podejścia, które przychodzą mi do głowy:
Utwórz niestandardową komórkę tabeli, która przedstawia widok całej komórki w żądany sposób
Zamiast dodawać obraz do widoku obrazu, wyczyść podglądy widoku obrazu, utwórz widok niestandardowy, który dodaje UIImageView dla obrazu i inny widok, być może prosty UIView, który zapewnia żądane odstępy, i dodaj go jako widok podrzędny widok obrazu.
Czy to ma sens?
źródło
Tak, możesz zwiększyć lub zmniejszyć odstępy (wypełnienie) między dwiema komórkami, tworząc jeden widok bazowy w widoku zawartości w komórce.Ustaw wyraźny kolor tła widoku zawartości i możesz dostosować wysokość widoku bazowego, aby utworzyć odstęp między komórkami.
źródło
Na podstawie odpowiedzi Husama: użycie warstwy komórek zamiast widoku zawartości umożliwia dodanie obramowania wokół całej komórki i akcesoriów w razie potrzeby. Ta metoda wymaga starannego dostosowania dolnych ograniczeń komórki, a także tych wstawek, w przeciwnym razie widok nie będzie właściwy.
źródło
Zmień liczbę wierszy w sekcji na 1 Zmieniłeś liczbę sekcji zamiast liczby wierszy
Tutaj wstawiasz odstępy między rzędami
źródło
Myślę, że to najczystsze rozwiązanie:
źródło
layoutMargins
ten sposób nie widziałem żadnej wizualnej zmiany . Może dlatego, że używam autoukładu.Ten artykuł pomógł, to mniej więcej to, co powiedziały inne odpowiedzi, ale podsumowujące i zwięzłe
https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6
W nim stosuje je tylko do lewej i prawej strony, ale
UIEdgeInsetsMake
init pozwala na dodanie wypełnienia do wszystkich czterech punktów.Zauważ, że UIEdgeInsets można również osiągnąć to samo.
Xcode 9.3 / Swift 4
źródło
Używanie kilku różnych sekcji nie jest potrzebne. Inne odpowiedzi wykorzystują wstawki ramek, CGRect i warstwy oraz ... BLAH. Niedobrze; użyj automatycznego układu i niestandardowego UITableViewCell. W tym UITableViewCell, zamiast wyświetlać zawartość wewnątrz contentView, utwórz nowy containerView (UIView), wyświetl widok kontenera w ramach contentView, a następnie przejrzyj wszystkie widoki w widoku kontenera.
Aby wprowadzić odstępy teraz, po prostu edytuj marginesy układu widoku kontenera, na przykład:
źródło
Spróbuj zajrzeć do - (UIEdgeInsets) layoutMargins; na komórce
źródło
Moja sytuacja była taka, że użyłem niestandardowego UIView, aby viewForHeader w sekcji również heightForHeader w sekcji zwrócić stałą wysokość, powiedzmy 40, problem polegał na tym, że nie ma danych, wszystkie widoki nagłówka zostały ze sobą dotknięte. więc chciałem ustawić odstęp między sekcją w przypadku braku danych, więc naprawiłem go, zmieniając po prostu płaszczyznę „stylu tabeli” na „Grupa”. I to zadziałało.
źródło
Sprawdź moje rozwiązanie na GitHub z podklasą
UITableView
i korzystaniem z funkcji środowiska uruchomieniowego Objective-C.Zasadniczo wykorzystuje prywatną strukturę danych Apple
UITableViewRowData
, którą uzyskałem, wyszukując prywatny nagłówek środowiska uruchomieniowegoUITableView
:https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h ,
a oto pożądana klasa prywatna, która zawiera wszystko, czego potrzebujesz, aby rozmieścić odstępy między komórkami w dowolny sposób, bez ustawiania ich w klasach komórek:
https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h
źródło
Miałem problem z uruchomieniem tego razem z kolorami tła i widokami akcesoriów w komórce. Skończyło się na:
1) Ustaw właściwość widoku tła komórek za pomocą zestawu UIView z kolorem tła.
2) Zmień położenie tego widoku w layoutSubviews, aby dodać ideę odstępów
źródło
Używanie nagłówków jako odstępów działałoby dobrze, jeśli nie chcesz używać żadnych nagłówków. W przeciwnym razie prawdopodobnie nie jest to najlepszy pomysł. Myślę o utworzeniu niestandardowego widoku komórki.
Przykłady:
W komórce niestandardowej utwórz widok tła z ograniczeniami, aby nie wypełniał całej komórki, nadaj jej trochę wypełnienia.
Następnie spraw, aby tło widoku tabeli było niewidoczne i usuń separatory:
źródło
Jeśli nie chcesz zmieniać sekcji i numeru wiersza widoku tabeli (tak jak ja), oto co musisz zrobić:
1) Dodaj ImageView na dole widoku komórki tabeli.
2) Ustaw ten sam kolor, co kolor tła widoku tabeli.
Zrobiłem to w mojej aplikacji i działa idealnie. Twoje zdrowie! :RE
źródło
SWift-5, odstępy między UITableViewCell
źródło
Możesz po prostu użyć ograniczenia w kodzie w następujący sposób:
ważne jest, aby dodać widok podrzędny (kontener) i umieścić w nim inne elementy.
źródło
dodaj widok wewnętrzny do komórki, a następnie dodaj do niej własne widoki.
źródło
Rozwiązanie Swift 5.0
W podklasie UITableViewCell
źródło
Użyj UITableViewDelegate
heightForRowAtIndexPath
i zwróć wysokość wiersza.źródło