Mam aplikację, w której UITableView
wstawka separatora jest ustawiona na niestandardowe wartości - prawo 0
, lewo 0
. Działa to doskonale w iOS 7.x
, ale iOS 8.0
widzę, że wstawka separatora jest ustawiona na domyślną wartość 15
po prawej stronie. Mimo że w plikach xib ustawiono na0
nadal wyświetla się niepoprawnie.
Jak usunąć UITableViewCell
marginesy separatora?
ios
objective-c
swift
uitableview
ios8
użytkownik3570727
źródło
źródło
[UIColor clearColor]
i narysowanie własnych separatorów. W ten sposób jesteś znacznie bardziej elastyczny.UITableViewCellSeparatorStyle
domyślnych wartości. Nawet zaakceptowana odpowiedź to naprawdę brudny hack.Odpowiedzi:
iOS 8.0 wprowadza właściwość layoutMargins do komórek ORAZ widoków tabeli.
Ta właściwość nie jest dostępna w systemie iOS 7.0, dlatego musisz ją sprawdzić przed przypisaniem!
Łatwym rozwiązaniem jest podklasowanie komórki i zastąpienie właściwości marginesów układu, zgodnie z sugestią @ user3570727. Utracisz jednak zachowanie systemu, takie jak dziedziczenie marginesów z obszaru bezpiecznego, więc nie polecam poniższego rozwiązania:
(Cel C)
(szybkie 4.2):
Jeśli nie chcesz przesłonić właściwości lub musisz ustawić ją warunkowo, czytaj dalej.
Oprócz tej
layoutMargins
właściwości firma Apple dodała do komórki właściwość , która uniemożliwi dziedziczenie ustawień marginesów widoku tabeli. Po ustawieniu tej właściwości komórki mogą konfigurować własne marginesy niezależnie od widoku tabeli. Potraktuj to jako nadpisanie.Ta właściwość jest wywoływana
preservesSuperviewLayoutMargins
, a jej ustawienieNO
pozwoli nalayoutMargin
zastąpienie ustawienia komórki tym, colayoutMargin
jest ustawione na TableView. Oba oszczędzają czas ( nie musisz modyfikować ustawień Widoku tabeli ) i są bardziej zwięzłe. Szczegółowe wyjaśnienie znajduje się w odpowiedzi Mike'a Abdullaha.UWAGA: poniżej znajduje się czysta implementacja ustawienia marginesu na poziomie komórki , wyrażona w odpowiedzi Mike'a Abdullaha. Ustawienie komórki
preservesSuperviewLayoutMargins=NO
zapewni, że widok tabeli nie zastąpi ustawień komórki. Jeśli chcesz, aby cały widok tabeli miał spójne marginesy, odpowiednio dostosuj kod.Skonfiguruj marginesy komórkowe:
Swift 4:
Ustawienie
preservesSuperviewLayoutMargins
właściwości w komórce na NIE powinno uniemożliwić widok tabeli nadpisujący marginesy komórki. W niektórych przypadkach wydaje się, że nie działa poprawnie.Jeśli wszystko zawiedzie, możesz brutalnie wymusić marginesy widoku tabeli:
Swift 4:
... i proszę bardzo! To powinno działać na iOS 7 i 8.
EDIT: Mohamed Saleh zwrócił moją uwagę ewentualne zmiany w iOS 9. Być może trzeba ustawić Table View na
cellLayoutMarginsFollowReadableWidth
celuNO
, jeśli chcesz dostosować wypustki lub marże. Twój przebieg może się różnić, nie jest to dobrze udokumentowane.Ta właściwość istnieje tylko w iOS 9, więc sprawdź ją przed ustawieniem.
Swift 4:
(powyższy kod z wstawki 0 separatora UITableView dla systemu iOS 8 nie działa )
EDYCJA: Oto czysta metoda Konstruktora interfejsów:
UWAGA: iOS 11 zmienia i upraszcza wiele z tego zachowania, nadchodzi aktualizacja ...
źródło
cell.preservesSuperviewLayoutMargins = NO
według sugestii @ bffmike lub po przewinięciu sposobu wyświetlania wstawek. (wtf ??)cell.preservesSuperviewLayoutMargins
w mojej metodzie źródła danych:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Po rozegraniu jednej z tych czynności w
Cell
podklasie:lub ustawienie
cell.layoutMargins = UIEdgeInsetsZero;
naprawione dla mnie.źródło
separatorInset
w IB nie działała. występuje również problem z kolorami tła widoku tabeli. to jest naprawdę chore.Poświęć chwilę na zrozumienie problemu, zanim zaczniesz ślepo ładować, aby spróbować go naprawić.
Szybkie przeczesywanie w debuggerze powie ci, że linie separatora są widokami podrzędnymi
UITableViewCell
. Wygląda na to, że sama komórka bierze znaczną odpowiedzialność za układ tych linii.iOS 8 wprowadza pojęcie marginesów układu . Domyślnie marginesy układu widoku są
8pt
ze wszystkich stron i są dziedziczone z widoków przodka.Jak najlepiej możemy powiedzieć, układając linię separatora,
UITableViewCell
decyduje się przestrzegać marginesu układu po lewej stronie, używając go do ograniczenia lewej wstawki.Łącząc to wszystko, aby osiągnąć pożądany przedział naprawdę zerowy, musimy:
0
Mówiąc tak, jest to dość proste zadanie do osiągnięcia:
Ważne uwagi:
preservesSuperviewLayoutMargins
razie potrzeby można określić zdefiniowany przez użytkownika atrybut środowiska wykonawczego .preservesSuperviewLayoutMargins
, to można skonfigurować przodek widoki (takie jak w tabeli), aby0
lewy margines też, ale to wydaje się z natury bardziej podatne na błędy, jak nie kontrolują tego całą hierarchię.0
i pozostawienie pozostałych.UITableView
rysują na dole zwykłych tabel, zgaduję, że będzie to wymagało określenia tych samych ustawień również na poziomie tabeli (nie próbowałem tego!)źródło
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
ipreservesSuperviewLayoutMargins
na komórce jest wszystkim, czego potrzeba. Wszystko inne przypomina zaufanie do voodoo.separatorInset
od aUITableViewCell
w iOS 8, trzeba ustawić UstawUIEdgeInsets
na zero zarówno naUITableView
iUITableViewCell
. Jeśli nie zrobisz obu, nadal będziesz mieć lewą wstawkę, która jest większa od zera. Potwierdziłem to wiele razy.Sądzę, że to to samo pytanie, które tutaj zadałem: Usuń SeparatorInset na iOS 8 UITableView dla XCode 6 iPhone Simulator
W iOS 8 istnieje jedna nowa właściwość dla wszystkich dziedziczonych obiektów
UIView
. Tak więc rozwiązanie, aby ustawićSeparatorInset
w iOS 7.x nie będzie w stanie usunąć białych znaków widocznych na UITableView w iOS 8.Nowa właściwość nosi nazwę „ layoutMargins ”.
Rozwiązanie:-
Jeśli ustawisz
cell.layoutMargins = UIEdgeInsetsZero;
bez sprawdzania, czylayoutMargins
istnieje, aplikacja ulegnie awarii w systemie iOS 7.x. Najlepszym sposobem byłoby sprawdzenie, czylayoutMargins
istnieje wcześniejsetLayoutMargins:UIEdgeInsetsZero
.źródło
Możesz użyć UIAppearance raz, podczas uruchamiania aplikacji (przed załadowaniem interfejsu użytkownika), aby ustawić go jako domyślne ustawienia globalne:
W ten sposób utrzymujesz kod UIViewController w czystości i zawsze możesz go zastąpić, jeśli chcesz.
źródło
iOS wprowadza właściwość layoutMargins do komórek ORAZ widoków tabeli.
Ta właściwość nie jest dostępna w iOS 7.0, więc musisz ją sprawdzić przed przypisaniem!
Apple dodał jednak do komórki właściwość o nazwieservesSuperviewLayoutMargins , która uniemożliwi dziedziczenie ustawień marginesów w widoku tabeli. W ten sposób komórki mogą konfigurować własne marginesy niezależnie od widoku tabeli. Potraktuj to jako nadpisanie.
Ta właściwość jest nazywany preservesSuperviewLayoutMargins i ustawienie go na NO może zezwolić, aby zastąpić ustawienia layoutMargin stole widok jest z ustawieniem layoutMargin swojej własnej komórki. Oba oszczędzają czas ( nie musisz modyfikować ustawień Widoku tabeli ) i są bardziej zwięzłe. Szczegółowe wyjaśnienie znajduje się w odpowiedzi Mike'a Abdullaha.
UWAGA: jest to właściwa, mniej niechlujna implementacja, wyrażona w odpowiedzi Mike'a Abdullaha; ustawienie zachowań komórki w komórceSuperviewLayoutMargins = NIE zapewni, że widok tabeli nie zastąpi ustawień komórki.
Pierwszy krok - skonfiguruj marginesy komórkowe:
Ustawienie właściwościserveesSuperviewLayoutMargins w komórce na NIE powinno uniemożliwić widok tabeli nadpisujący marginesy komórki. W niektórych przypadkach wydaje się, że nie działa poprawnie.
Drugi krok - tylko jeśli wszystko zawiedzie, możesz brutalnie wymusić marginesy widoku tabeli:
... i proszę bardzo! To powinno działać na iOS 8, a także iOS 7.
Uwaga: testowane na iOS 8.1 i 7.1, w moim przypadku potrzebowałem tylko pierwszego kroku tego wyjaśnienia.
Drugi krok jest wymagany tylko wtedy, gdy pod renderowanymi komórkami znajduje się niepopulowana komórka, tj. jeśli tabela jest większa niż liczba wierszy w modelu tabel. Nie wykonanie drugiego kroku spowoduje różne przesunięcia separatora.
źródło
willDisplayCell
metodzie, ponieważ sama metoda jest już iOS 8+ i nigdy nie będzie wywoływana ze starszych wersji.W Swift jest to trochę bardziej irytujące, ponieważ
layoutMargins
jest właściwością, więc musisz zastąpić gettera i setera.To skutecznie zrobi
layoutMargins
tylko do odczytu, co w moim przypadku jest w porządku.źródło
W systemie iOS 9 musisz dodać:
Więcej informacji znajduje się w pytaniu .
źródło
Chciałem tylko udostępnić rozszerzenie, które zrobiłem, aby usunąć marginesy z separatorów komórek widoku tabeli.
Używany w kontekście:
źródło
Szybki:
źródło
Sprawiłem, że działało to:
źródło
Jeśli chodzi o to, co sugeruje cdstamper zamiast widoku tabeli, dla mnie działa dodawanie poniżej linii w układzie layoutSubview komórki.
źródło
Przykład Swift 3.0:
źródło
Po długim dochodzeniu ...
Oto jedyny sposób, aby w pełni kontrolować te rzeczy (które mogłem znaleźć)
Aby w pełni kontrolować zarówno wstawki separatora, jak i marginesy układu w każdej komórce. Zrób to w
willDisplayCell
metodzie na swoimUITableviewDelegate
.Obiekt komórki kontroluje separator, a
contentView
kontroluje wszystko inne. Jeśli wstawiane przestrzenie separatora są wyświetlane w nieoczekiwanym kolorze, powinno to rozwiązać:źródło
Proste rozwiązanie w Swift na iOS 8 z niestandardowym
UITableViewCell
W ten sposób ustawiasz
layoutMargin
iseparatorInset
tylko raz zamiast robić to dla każdegowillDisplayCell
jak sugeruje większość powyższych odpowiedzi.Jeśli korzystasz z niestandardowego,
UITableViewCell
jest to właściwe miejsce, aby to zrobić. W przeciwnym razie powinieneś to zrobićtableView:cellForRowAtIndexPath
.Kolejna wskazówka: nie trzeba ustawiać,
preservesSuperviewLayoutMargins = false
ponieważ wartość domyślna już jestNO
!źródło
Dla mnie prosta linia zadziałała
źródło
Wystarczy dodać poniższy kod, aby rozwiązać ten program.
Powodzenia!
źródło
Łukasz odpowiedział w Swift:
źródło
Oto kod, który działa dla mnie w Swift:
Wydaje mi się to najczystsze (na razie), ponieważ wszystkie korekty krawędzi / marginesu cell / tableView są wykonywane w
tableView:willDisplayCell:forRowAtIndexPath:
metodzie, bez wrzucania niepotrzebnego kodutableView:cellForRowAtIndexPath:
.Przy okazji, ustawiam tylko lewy separator komórki Inset / layoutMargins, ponieważ w tym przypadku nie chcę zepsuć moich ograniczeń, które ustawiłem w komórce.
Zaktualizowano kod do Swift 2.2:
źródło
Większość odpowiedzi pokazują wypustki separujące i marginesy układ jest ustawiony nad różnymi metodami (tj
viewDidLayoutSubviews
,willDisplayCell
itp) do komórek i tableviews, ale odkryłem, że tylko wprowadzenie w nichcellForRowAtIndexPath
działa świetnie. Wydaje się, że to najczystszy sposób.źródło
Użyj poniższego fragmentu kodu, aby uniknąć niepożądanego problemu wypełniania UITableView w IOS 8 i 7.
źródło
Zamiast aktualizować
preservesSuperviewLayoutMargins
i zalayoutMargins
każdym razem, gdy komórka przewija się (używawillDisplayCell
), sugeruję zrobić to razcellForRowAtIndexPath:
:źródło
Oto prosty sposób na globalne usunięcie wstawki.
W
UITableViewCell+Extensions.swift
:W
AppDelegate
application:didFinishLaunchingWithOptions:
:Możesz pomyśleć o a) po prostu zastąpić
separatorInset
rozszerzenie lub b)layoutMargins
zamiast tego ustawić proxy wyglądu . Żadne nie zadziała. Mimo żeseparatorInset
jest wskazana jako właściwość, próba zastąpienia jej jako właściwości (lub metody) generuje błędy kompilatora. Oraz ustawianie proxy wyglądUITableViewCell
„slayoutMargins
(lub, jeśli o to chodzi, również ustawienie proxy wyglądUITableView
” slayoutMargins
iseparatorInset
) nie ma żadnego wpływu.źródło
W iOS8:
Dodanie tego do mojej podklasy UITableViewCell:
i to do „tableView: cellForRowAtIndexPath” lub „tableView: willDisplayCell”:
DZIAŁAŁ dla mnie.
źródło
Dla dowolnej określonej komórki chcesz ukryć separator.
źródło
Po obejrzeniu odpowiedzi na 3. piętrze próbowałem dowiedzieć się, jaki jest związek między ustawieniem separatora między TableView a TableViewCell i wykonałem test. Oto moje wnioski:
możemy rozważyć, że ustawienie separatora komórki na zero musi przesunąć separator w dwóch krokach: pierwszym krokiem jest ustawienie zestawu separatorów komórki na zero. drugim krokiem jest ustawienie marginesu komórki na zero.
ustaw tabelę separatora TableView, a marginesout może wpływać na separator komórki . Jednak z testu wynika, że zestaw separatora TableView wydaje się być bezużyteczny, marginesy TableView mogą faktycznie wpływać na marginesy komórki .
set Cell's PreservesSuperviewLayoutMargins = false, może odciąć efekt marginlayout TableView na komórkach.
jedno z rozwiązań:
źródło
To jest moje rozwiązanie. Dotyczy to niestandardowej podklasy komórek, wystarczy dodać je obie do podklasy.
2)
Wygodne jest dostosowanie pozycji separatora bez konieczności rysowania go przez projektanta ..........
źródło
W bardziej zwarty sposób niż najczęściej głosowana odpowiedź ...
}
źródło
Dodanie tego fragmentu, prosty elegancki w Swift działa dla mnie w iOS8 :)
źródło
Działa to idealnie dla mnie w iOS 8 i iOS 9.
Dla OBJ-C
źródło