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?


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

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];
    }
}

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


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
}

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
    }
}

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


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


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;

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

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;

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) {

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:


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
    }
}

1

In viewDidLoad(getestet iOS11 - Swift 4.1)

Versuchen

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


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.