Ich habe eine App, in der UITableView
der Trennzeicheneinsatz des Benutzers auf benutzerdefinierte Werte eingestellt ist - rechts 0
, links 0
. Dies funktioniert perfekt in iOS 7.x
, aber iOS 8.0
ich sehe, dass der Separator-Einschub auf den Standardwert von 15
rechts gesetzt ist. Obwohl in den XIB-Dateien, auf die es eingestellt ist, 0
wird es immer noch falsch angezeigt .
Wie entferne ich die UITableViewCell
Trennränder?
ios
objective-c
swift
uitableview
ios8
user3570727
quelle
quelle
[UIColor clearColor]
und eigene Separatoren zu zeichnen. Auf diese Weise sind Sie viel flexibler.UITableViewCellSeparatorStyle
Standardeinstellungen ist. Sogar die akzeptierte Antwort ist meiner Meinung nach ein wirklich schmutziger Hack.Antworten:
iOS 8.0 führt die Eigenschaft layoutMargins für Zellen- UND Tabellenansichten ein.
Diese Eigenschaft ist unter iOS 7.0 nicht verfügbar. Sie müssen sie daher überprüfen, bevor Sie sie zuweisen.
Die einfache Lösung besteht darin, Ihre Zelle in Unterklassen zu unterteilen und die Layoutränder-Eigenschaft zu überschreiben, wie von @ user3570727 vorgeschlagen. Sie verlieren jedoch jegliches Systemverhalten wie das Erben von Rändern aus dem sicheren Bereich. Daher empfehle ich die folgende Lösung nicht:
(Ziel c)
(schnell 4.2):
Wenn Sie die Eigenschaft nicht überschreiben möchten oder bedingt festlegen müssen, lesen Sie weiter.
Zusätzlich zu dieser
layoutMargins
Eigenschaft hat Apple Ihrer Zelle eine Eigenschaft hinzugefügt , die verhindert, dass die Randeinstellungen Ihrer Tabellenansicht übernommen werden. Wenn diese Eigenschaft festgelegt ist, können Ihre Zellen unabhängig von der Tabellenansicht ihre eigenen Ränder konfigurieren. Betrachten Sie es als Überschreibung.Diese Eigenschaft wird aufgerufen
preservesSuperviewLayoutMargins
, und wenn Sie sie auf festlegen,NO
kann dielayoutMargin
Einstellung der Zelle allelayoutMargin
in Ihrer TableView festgelegten Einstellungen überschreiben . Beides spart Zeit ( Sie müssen die Einstellungen der Tabellenansicht nicht ändern ) und ist präziser. Eine ausführliche Erklärung finden Sie in der Antwort von Mike Abdullah.HINWEIS: Was folgt, ist eine saubere Implementierung für eine Randeinstellung auf Zellebene , wie in der Antwort von Mike Abdullah ausgedrückt. Durch das Festlegen Ihrer Zellen
preservesSuperviewLayoutMargins=NO
wird sichergestellt, dass Ihre Tabellenansicht die Zelleneinstellungen nicht überschreibt. Wenn Sie tatsächlich möchten, dass Ihre gesamte Tabellenansicht konsistente Ränder aufweist, passen Sie Ihren Code entsprechend an.Richten Sie Ihre Zellränder ein:
Swift 4:
Wenn Sie die
preservesSuperviewLayoutMargins
Eigenschaft für Ihre Zelle auf NEIN setzen, sollte verhindert werden, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es nicht richtig zu funktionieren.Wenn alles fehlschlägt, können Sie Ihre Tabellenansichtsränder brutal erzwingen:
Swift 4:
... und los geht's! Dies sollte unter iOS 7 und 8 funktionieren.
BEARBEITEN: Mohamed Saleh machte mich auf eine mögliche Änderung in iOS 9 aufmerksam. Möglicherweise müssen Sie die Tabellenansichten auf einstellen
cellLayoutMarginsFollowReadableWidth
,NO
wenn Sie Einfügungen oder Ränder anpassen möchten. Ihr Kilometerstand kann variieren, dies ist nicht sehr gut dokumentiert.Diese Eigenschaft ist nur in iOS 9 vorhanden. Überprüfen Sie sie daher unbedingt, bevor Sie sie einstellen.
Swift 4:
(über Code von iOS 8 UITableView Separator Inset 0 funktioniert nicht )
EDIT: Hier ist ein reiner Interface Builder-Ansatz:
HINWEIS: iOS 11 ändert und vereinfacht einen Großteil dieses Verhaltens. Ein Update wird in Kürze veröffentlicht.
quelle
cell.preservesSuperviewLayoutMargins = NO
per @ bffmikes Vorschlag oder nach dem Scrollen eine Art und Weise hinzufügen musste, wie die Einfügungen erscheinen würden. (wtf ??)cell.preservesSuperviewLayoutMargins
in meiner Datenquellenmethode:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Nachdem Sie herumgespielt haben, tun Sie dies entweder in Ihrer
Cell
Unterklasse:oder das
cell.layoutMargins = UIEdgeInsetsZero;
für mich fixiert einstellen .quelle
separatorInset
in IB hat nicht funktioniert. Es gibt auch ein Problem mit den Hintergrundfarben der Tabellenansicht. Das ist wirklich krankes Zeug.Nehmen wir uns einen Moment Zeit, um das Problem zu verstehen, bevor wir blindlings aufladen, um zu versuchen, es zu beheben.
Ein kurzer Blick in den Debugger zeigt Ihnen, dass Trennlinien Unteransichten von sind
UITableViewCell
. Es scheint, dass die Zelle selbst eine angemessene Verantwortung für das Layout dieser Linien übernimmt.iOS 8 führt das Konzept der Layoutränder ein . Standardmäßig befinden sich die Layoutränder einer Ansicht
8pt
auf allen Seiten und werden von den Vorfahrenansichten geerbt .Wie wir am besten erkennen können, wird beim Auslegen der Trennlinie
UITableViewCell
der linke Layoutrand berücksichtigt, um den linken Einschub einzuschränken.Wenn wir all das zusammenfassen, um den gewünschten Einschub von wirklich Null zu erreichen, müssen wir:
0
So ausgedrückt ist es eine ziemlich einfache Aufgabe:
Dinge zu beachten:
preservesSuperviewLayoutMargins
.preservesSuperviewLayoutMargins
, können Sie Vorfahrenansichten (z. B. die Tabelle) so konfigurieren, dass sie auch einen0
linken Rand haben. Dies scheint jedoch von Natur aus fehleranfälliger zu sein, da Sie nicht die gesamte Hierarchie steuern.0
und die anderen zu lassen.UITableView
am unteren Rand von Tabellen im einfachen Stil gezeichnet werden, müssen Sie vermutlich auch auf Tabellenebene dieselben Einstellungen angeben (haben Sie diese nicht ausprobiert!).quelle
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
undpreservesSuperviewLayoutMargins
der Zelle alles ist, was erforderlich ist. Alles andere fühlt sich an, als würde man auf Voodoo vertrauen.separatorInset
einesUITableViewCell
in iOS 8, müssen Sie den Satz setzen dieUIEdgeInsets
Null auf beidenUITableView
und derUITableViewCell
. Wenn Sie nicht beides tun, haben Sie immer noch einen linken Einschub, der größer als Null ist. Ich habe dies mehrfach bestätigt.Ich glaube, dies ist die gleiche Frage, die ich hier gestellt habe: Entfernen Sie SeparatorInset unter iOS 8 UITableView für XCode 6 iPhone Simulator
In iOS 8 gibt es eine neue Eigenschaft für alle Objekte, von denen geerbt wird
UIView
. Also, die Lösung, um die einzustellenSeparatorInset
Festlegen von in iOS 7.x in der UITableView in iOS 8 angezeigten Leerraum nicht entfernen.Die neue Eigenschaft heißt " layoutMargins ".
Die Lösung:-
Wenn Sie festlegen,
cell.layoutMargins = UIEdgeInsetsZero;
ohne zu überprüfen, ob daslayoutMargins
vorhanden ist, stürzt die App unter iOS 7.x ab. Der beste Weg wäre also zu überprüfen, ob daslayoutMargins
zuerst existiertsetLayoutMargins:UIEdgeInsetsZero
.quelle
Sie können UIAppearance einmal beim Start Ihrer Anwendung (bevor die Benutzeroberfläche geladen wird) verwenden, um sie als globale Standardeinstellungen festzulegen:
Auf diese Weise halten Sie den Code Ihres UIViewControllers sauber und können ihn jederzeit überschreiben, wenn Sie möchten.
quelle
iOS führt die Eigenschaft layoutMargins für Zellen- UND Tabellenansichten ein.
Diese Eigenschaft ist in iOS 7.0 nicht verfügbar, daher müssen Sie sie überprüfen, bevor Sie sie zuweisen!
Allerdings hat Apple ein hinzugefügt Eigenschaft namens preservesSuperviewLayoutMargins für Ihr Handy , die es von vererben Ihrer Tabellenansicht der Randeinstellung zu verhindern. Auf diese Weise können Ihre Zellen unabhängig von der Tabellenansicht ihre eigenen Ränder konfigurieren. Betrachten Sie es als Überschreibung.
Diese Eigenschaft heißt preservesSuperviewLayoutMargins , und es NO Einstellung ermöglicht es Ihnen , Ihre Tabellenansicht der layoutMargin Einstellung mit Ihrer eigenen Zelle layoutMargin Einstellung außer Kraft zu setzen. Beides spart Zeit ( Sie müssen die Einstellungen der Tabellenansicht nicht ändern ) und ist präziser. Eine ausführliche Erklärung finden Sie in der Antwort von Mike Abdullah.
HINWEIS: Dies ist die richtige, weniger chaotische Implementierung, wie in der Antwort von Mike Abdullah ausgedrückt. Durch Festlegen der Vorbehalte Ihrer ZelleServerviewLayoutMargins = NO wird sichergestellt, dass Ihre Tabellenansicht die Zelleneinstellungen nicht überschreibt.
Erster Schritt - Richten Sie Ihre Zellränder ein:
Wenn Sie die EigenschafterveSuperviewLayoutMargins für Ihre Zelle auf NO setzen, sollte verhindert werden, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es nicht richtig zu funktionieren.
Zweiter Schritt - Nur wenn alles fehlschlägt, können Sie Ihre Tabellenansichtsränder brutal erzwingen:
... und los geht's! Dies sollte sowohl unter iOS 8 als auch unter iOS 7 funktionieren.
Hinweis: Mit iOS 8.1 und 7.1 getestet. In meinem Fall musste ich nur den ersten Schritt dieser Erklärung verwenden.
Der zweite Schritt ist nur erforderlich, wenn Sie eine nicht ausgefüllte Zelle unter den gerenderten Zellen haben, d. H. Wenn die Tabelle größer als die Anzahl der Zeilen im Tabellenmodell ist. Wenn der zweite Schritt nicht ausgeführt wird, führt dies zu unterschiedlichen Trennzeichenversätzen.
quelle
willDisplayCell
Methode nicht nach Selektoren suchen, da die Methode selbst bereits iOS 8+ ist und von älteren Versionen niemals aufgerufen wird.In Swift ist es etwas ärgerlicher, weil
layoutMargins
es eine Eigenschaft ist, also müssen Sie den Getter und den Setter überschreiben .Dies wird effektiv
layoutMargins
schreibgeschützt machen , was in meinem Fall in Ordnung ist.quelle
Für iOS 9 müssen Sie Folgendes hinzufügen:
Weitere Einzelheiten entnehmen Sie bitte der Frage .
quelle
Ich wollte nur eine Erweiterung freigeben, die ich gemacht habe, um die Ränder aus den Tabellenansicht-Zellentrennzeichen zu entfernen.
Wird im Kontext verwendet:
quelle
Schnell:
quelle
Ich habe es so gemacht:
quelle
In Bezug auf das, was cdstamper anstelle der Tabellenansicht vorgeschlagen hat, funktioniert das Hinzufügen der folgenden Zeilen in der layoutSubview-Methode der Zelle für mich.
quelle
Swift 3.0 Beispiel:
quelle
Nach langem Nachforschen ...
Hier ist die einzige Möglichkeit, dieses Zeug vollständig zu kontrollieren (das ich finden konnte)
Vollständige Steuerung der Trennzeicheneinfügungen und Layoutränder in jeder Zelle. Tun Sie dies in der
willDisplayCell
Methode auf IhremUITableviewDelegate
.Das Zellenobjekt steuert das Trennzeichen und
contentView
alles andere. Wenn die Leerzeichen Ihrer Trennzeichen in einer unerwarteten Farbe angezeigt werden, sollte dies folgende Probleme lösen:quelle
Einfache Lösung in Swift für iOS 8 mit einem benutzerdefinierten
UITableViewCell
Auf diese Weise setzen Sie
layoutMargin
undseparatorInset
nur einmal, anstatt es für jedes zu tun,willDisplayCell
wie die meisten der obigen Antworten vorschlagen.Wenn Sie einen benutzerdefinierten Benutzer verwenden, ist
UITableViewCell
dies der richtige Ort, um dies zu tun. Ansonsten solltest du es in tuntableView:cellForRowAtIndexPath
.Nur ein weiterer Hinweis: Sie müssen nicht festlegen,
preservesSuperviewLayoutMargins = false
da der Standardwert bereits istNO
!quelle
Für mich hat die einfache Linie den Job gemacht
quelle
Fügen Sie einfach den folgenden Code hinzu, um dieses Programm zu lösen.
Viel Glück!
quelle
Lukasz antwortet in Swift:
quelle
Dies ist der Code, der für mich in Swift funktioniert:
Dies scheint mir (vorerst) am saubersten zu sein, da alle Zellen- / Tabellenansicht-Kanten- / Randanpassungen in der
tableView:willDisplayCell:forRowAtIndexPath:
Methode vorgenommen werden, ohne unnötigen Code einzupferchentableView:cellForRowAtIndexPath:
.Übrigens setze ich nur das linke SeparatorInset / layoutMargins der Zelle, weil ich in diesem Fall meine Einschränkungen, die ich in meiner Zelle eingerichtet habe, nicht vermasseln möchte.
Code aktualisiert auf Swift 2.2:
quelle
Die meisten Antworten zeigen Separator Einfügungen und Layout - Ränder über eine Vielzahl von Verfahren eingestellt werden (dh
viewDidLayoutSubviews
,willDisplayCell
usw.) für Zellen und Tableviews, aber ich habe festgestellt , dass diese in nur darum ,cellForRowAtIndexPath
großen Werken. Scheint der sauberste Weg zu sein.quelle
Verwenden Sie das folgende Code-Snippet, um unerwünschte Auffüllprobleme für UITableView in IOS 8 und 7 zu vermeiden.
quelle
Anstatt zu aktualisieren
preservesSuperviewLayoutMargins
undlayoutMargins
jedes Mal, wenn die Zelle einen Bildlauf durchführt (mitwillDisplayCell
), würde ich vorschlagen, dies einmal zu tuncellForRowAtIndexPath:
:quelle
Hier ist eine einfache Möglichkeit, den Einschub global zu entfernen.
In
UITableViewCell+Extensions.swift
:In
AppDelegate
application:didFinishLaunchingWithOptions:
:Sie könnten denken, a) auch nur
separatorInset
in der Erweiterung überschreiben oder b)layoutMargins
stattdessen den Erscheinungs-Proxy für festlegen . Beides wird nicht funktionieren. ObwohlseparatorInset
angegeben wird, dass es sich um eine Eigenschaft handelt, führt der Versuch, sie als Eigenschaft (oder Methode) zu überschreiben, zu Compilerfehlern. Das Festlegen des Erscheinungs-Proxys fürUITableViewCell
'slayoutMargins
(oder auch das Festlegen der Erscheinungs-Proxys fürUITableView
' slayoutMargins
undseparatorInset
) hat keine Auswirkung.quelle
In iOS8:
Hinzufügen zu meiner UITableViewCell-Unterklasse:
und dies zu "tableView: cellForRowAtIndexPath" oder "tableView: willDisplayCell":
Für mich gearbeitet.
quelle
Für eine bestimmte Zelle möchten Sie das Trennzeichen ausblenden.
quelle
Nachdem ich die Antworten in Etage 3 gesehen hatte, versuchte ich herauszufinden, in welcher Beziehung das Einrichten des Trennzeichens zwischen TableView und TableViewCell steht, und führte einige Tests durch. Hier sind meine Schlussfolgerungen:
Wir können davon ausgehen, dass das Setzen des Trennzeichens der Zelle auf Null das Trennzeichen in zwei Schritten verschieben muss: Der erste Schritt besteht darin, das Trennzeichen der Zelle auf Null zu setzen. Der zweite Schritt besteht darin, das Randlayout der Zelle auf Null zu setzen.
stellen Sie die die Tableview separatorinset und marginlayout kann der Zelle beeinflussen separatorinset . Aus dem Test geht jedoch hervor, dass das Separator- Set von TableView nutzlos zu sein scheint. Das Marginlayout von TableView kann sich tatsächlich auf das Marginlayout der Zelle auswirken .
Wenn Sie PreservesSuperviewLayoutMargins = false von Cell festlegen , kann der Marginlayout- Effekt von TableView für Zellen abgeschnitten werden .
eine der Lösungen:
quelle
Das ist meine Lösung. Dies gilt für die benutzerdefinierte Zellenunterklasse. Fügen Sie beide einfach zur Unterklasse hinzu.
2.
Und es ist praktisch, dass Sie die Position des Trennzeichens anpassen können, ohne Ihren Designer zu bitten, eines für Sie zu zeichnen ..........
quelle
Kompakter als die am meisten gewählte Antwort ...
}}
quelle
Das Hinzufügen dieses Snippets, einfach elegant in Swift, funktioniert für mich in iOS8 :)
quelle
Dies funktionierte perfekt für mich in iOS 8 und iOS 9.
Für OBJ-C
quelle