So legen Sie die volle Breite des Trennzeichens in UITableView fest

148

Ich habe eine, UITableViewwo die Trennzeichen nicht die volle Breite haben. Es endet wie 10 Pixel vor der linken Seite. Ich habe mit diesem Code in der viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Auch im Storyboard, wenn Sie benutzerdefinierte oder Standard-Selektoren auswählen können. Jetzt haben alle Zellen, die ausgefüllt sind, nicht die Selektoren für die volle Breite, aber die Zellen, die leer sind, haben die volle Breite.

Wie kann ich das beheben?

Timo Cengiz
quelle
9
UITableViewhat eine Eigenschaft separatorInset. Setzen Sie den Einschub des UITableViewZeilentrennzeichens auf Null. Auch können Sie die separatorInsetaus dem Storyboard ändern
KRUKUSA

Antworten:

220

Dies funktionierte bei iOS 8.4 - 9.0-Geräten mit Xcode 6.4 und Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Swift 5 Update:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
MB_iOSDeveloper
quelle
Warum entfernt dies meinen Tisch mit einem leeren? Die Separatoren sind bewegt, aber ich kann keinen meiner Knöpfe sehen
Oscar
1
@James könntest du bitte erklären "entferne meinen Tisch mit einem leeren?". Wie haben Sie Ihre Schaltflächen hinzugefügt (über IB, Code)?
MB_iOSDeveloper
1
Sehr schöne Lösung. Aber in meinem Fall habe ich Code direkt in die Zelleninitialisierung eingefügt, weil ich in allen Controllern die volle Breite des Trennzeichens haben wollte.
Vojta
Falls es nicht offensichtlich ist, funktioniert dies natürlich auch für Objective-C mit den richtigen Syntaxänderungen.
Cohenadair
1
Keine dieser Lösungen funktioniert auf einem iPad. Dies funktioniert nur auf einem iPhone ...
Charles Robertson
103

Ich habe die Antwort von diesem Beitrag erhalten: iOS 8 UITableView Separator Inset 0 funktioniert nicht

Fügen Sie einfach diesen Code auf Ihrem UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}
Timo Cengiz
quelle
2
Es funktioniert für mich, wenn ich nur die tableView-Delegatenmethode hinzufüge
TonyTony
Es tut mir leid, dass ich nicht verstanden habe. Sie meinen, es hat gereicht, das TableViewDeleagte hinzuzufügen?. Ich habe nur versucht hinzuzufügen, dass es bei mir nicht funktioniert hat @TonyTony
Timo Cengiz
3
Für mich ist die Methode viewDidLayoutSubviewsnicht notwendig
TonyTony
Haben Sie versucht, Ihren Code mit anderen IOS-Versionen als 8 auszuführen? Vielleicht funktioniert es für die neuesten. Ansonsten gut für dich, dass es funktioniert. Ich habe versucht, nur die Tableview-Delegate-Methode hinzuzufügen, aber es hat nicht geholfen. @ TonyTony
Timo Cengiz
Ich musste beides benutzen. Ich habe versucht, jedes einzeln zu verwenden, ohne Erfolg. Es hat nur funktioniert, wenn ich beide verwendet habe. Außerdem habe ich es versucht, als mein View Controller eine Unterklasse von UITableViewController war und als es eine Unterklasse von UIViewController war. Kein Unterschied. Beachten Sie, dass ich im 8.1-Simulator laufe.
Ron
99

In deinem UITableViewCell

Gehen Sie in Ihrem Interface Builder zum Attributinspektor und ändern Sie einfach "15" in 0. Führen Sie dies für alle Zellen aus, die Sie ändern möchten.

instets

Möglicherweise müssen Sie [cell setLayoutMargins:UIEdgeInsetsZero];zu Ihrem hinzufügentableViewCell

HannahCarney
quelle
1
Oder das ist komisch. Dies funktionierte für mich (danke!) In den Zeilen, in denen UITableViewCells angezeigt werden sollten, aber in allen leeren Zeilen darunter wurde das Trennzeichen immer noch um 15 Pixel eingerückt.
Mike Gledhill
Wenn Sie statische Zellen verwenden, müssen Sie nur den linken Einschub auf 0 ändern, wie im Bild beschrieben (Arbeiten in iOS 10, Xcode 8.3.1)
Ignacio Valdivieso
29

für Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
Wilson
quelle
19

Ich erbe von UITableViewControllerund brauchte zusätzlich zu den beiden Insets Einstellungen willDisplayCellauch um preservesSuperviewLayoutMarginsauf false zu setzen . In Swift sieht es so aus:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}
H6.
quelle
Sie müssen nicht festlegen, preservesSuperviewLayoutMargins = falseda der Standardwert bereits falsch ist
Crubio
2
Beachten Sie, dass dadurch die Trennzeichen für vom Controller angezeigte Platzhalterzellen nicht angepasst werden, um die Ansicht unter Ihren Zellen auszufüllen, wenn Ihre Zellen nicht die volle Höhe haben.
Tieme
19
  1. Wähle Deine UITableViewCell
  2. Gehen Sie zum Attributinspektor
  3. Gehen Sie zu Separator und ändern Sie es in "Benutzerdefinierte Einfügungen".
  4. Set leftund / oder rightFelder. (Standardmäßig left: 15, right: 0)

Schauen Sie, wie es funktioniert (mit left: 100):

Geben Sie hier die Bildbeschreibung ein

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Sebastián Lara
quelle
1
Duplikat der vorherigen Antwort von @Hannah Louisa Carney
Konstantin Salavatov
11

Der Separator Insetist standardmäßig 15 von links. Ändern Sie die Separator- InsetOption von autobis customund setzen Sie den Einschub auf 0.

Geben Sie hier die Bildbeschreibung ein

Ramin
quelle
9

Für Swift in iOS 9+

Wenn Sie eine benutzerdefinierte verwenden UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

dann für dein UITableViewin viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
Christopher Larsen
quelle
Dies ist die einzige Antwort, die das Problem für mich behoben hat (aktualisiert auf Swift 3). Es funktioniert jedoch, wenn sich Daten in der Zelle befinden. Bei leeren Zellen, die noch nicht gefüllt wurden (und ich habe diese überschriebene Variable layoutMargins wohl nicht aufgerufen), füllt das Trennzeichen immer noch nicht die gesamte Breite meiner benutzerdefinierten Zelle in der Tabellenansicht. Irgendwelche Ideen dazu?
RanLearns
Auf dem iPhone endet das Trennzeichen nur wenige Pixel von links und einige Pixel von rechts in leeren Zellen. Das sieht in Ordnung aus, ohne diesen Trick zu verwenden, um die Ränder auf Null zu setzen. Auf dem iPad ist das eigentliche Problem - die Trennzeichen in einer leeren Zelle befinden sich am linken Rand der Tabellenansicht, nur etwa 80% der Breite der Zelle. Wenn sich Daten in der Zelle befinden, ist das Trennzeichen immer noch 80% der
Zellenbreite
1
Ich habe eine Lösung gefunden ... mit if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} wurde es so gemacht, dass ich Ihren Code auf dem iPhone überhaupt nicht brauche. Der Separator geht nur die volle Breite. Auf dem iPad haben die leeren Zellen ein Trennzeichen in voller Breite, aber ich benötige Ihren Code, um beim Hinzufügen von Daten die volle Breite beizubehalten. Andernfalls werden links einige Pixel hinzugefügt, bei denen kein Trennzeichen mehr vorhanden ist, sobald Daten die Zelle füllen.
RanLearns
1
Antworte, woher ich den Code im obigen Kommentar habe: stackoverflow.com/a/31538250/428981
RanLearns
9

Für Leute, die Probleme mit dem iPad haben - dies bringt Sie in einen Zustand, der mit dem iPhone identisch ist. Sie können das dann separatorInsetnach Bedarf anpassen .

tableView.cellLayoutMarginsFollowReadableWidth = false
Michael Rose
quelle
Dies war mein Problem unter iOS 10 und iOS 11. iOS 11 war in Ordnung, aber 10 hatte unterschiedliche Ränder. Vielen Dank!!!
migs647
9

Verwenden Sie es in der cellForRowAtIndexPathMethode,
um die Trennspezifikationen der Zelle zu konfigurieren. Es funktioniert perfekt für iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;
Aks
quelle
8

Getestet für iOS 9.3 & Swift 2.2. Stellen Sie sicher, dass Sie den Code, willDisplayCellder aufgerufen wird, unmittelbar vor dem Anzeigen der Zelle und nicht cellForRowAtIndexPathdort einfügen, wo Sie nur die Zelle erstellen.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Fügen Sie overrideder Funktion UITableViewControllerFolgendes hinzu:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
oyalhi
quelle
5

Keines der oben genannten Verfahren hat in Swift 2.2 und Xcode 7.3.1 für mich funktioniert

Es stellte sich heraus, dass dies die einfachste Lösung von allen war. Kein Code notwendig. Ändern Sie einfach die TableViewCellWerte für Layoutränder in Ihrem UITableViewInspektor:

Aurawindsurfen
quelle
4

Für Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}
Giulio Colleluori
quelle
1

In viewDidLoad(getestet iOS11 - Swift 4.1)

Versuchen

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)

Giang
quelle
0

Keine dieser Lösungen funktioniert auf dem iPad, aber ich habe eine Lösung gefunden, die beide Geräte abdeckt:

Mit wiederverwendbaren Zellen:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Mit nicht wiederverwendbaren Zellen:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Nur um diesen Ansatz zu erweitern:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Beide Eigenschaften können von UITableView& verwendet werden UITableViewCell. Letzteres ist in der Tat eine Eigenschaft von UIView, die eine Elternklasse von beiden UITableView& ist UITableViewCell.

Charles Robertson
quelle
1
Die einzige praktikable Lösung, die ich für nicht wiederverwendbare Zellen gefunden habe
Mickey
0

Swift 5, Xcode 11 Update

platziere dies in viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

Setzen Sie für das Trennzeichen von Kante zu Kante einfach den Wert von links und rechts auf 0.

Ändern Sie übrigens "yourTableView" in Ihren tableView Outlet-Namen.

Entwickler
quelle