686 Stimmen

IOS 8 UITableView Separator Einfügung 0 funktioniert nicht.

Ich habe eine App, in der der UITableView Separator-Einsatz auf benutzerdefinierte Werte - Rechts 0, Links 0 - festgelegt ist. Dies funktioniert perfekt in iOS 7.x, jedoch in iOS 8.0 sehe ich, dass der Separator-Einsatz standardmäßig auf 15 rechts gesetzt ist. Obwohl es in den xib-Dateien auf 0 eingestellt ist, wird es trotzdem falsch angezeigt.

Wie entferne ich die Ränder des UITableViewCell Separators?

42voto

King-Wizard Punkte 15270

iOS führt die layoutMargins-Eigenschaft in Zellen und Tabellenansichten ein.

Diese Eigenschaft ist in iOS 7.0 nicht verfügbar, daher müssen Sie sicherstellen, dass Sie überprüfen, bevor Sie sie zuweisen!

Apple hat jedoch eine Eigenschaft namens preservesSuperviewLayoutMargins zu Ihrer Zelle hinzugefügt, die verhindert, dass sie die Randeinstellungen Ihrer Tabellenansicht erbt. Auf diese Weise können Ihre Zellen ihre eigenen Ränder unabhängig von der Tabellenansicht konfigurieren. Denken Sie an eine Überschreibung.

Diese Eigenschaft heißt preservesSuperviewLayoutMargins und indem Sie diese auf NEIN setzen, können Sie die layoutMargin-Einstellungen Ihrer Tabellenansicht mit den Einstellungen Ihrer eigenen Zelle überschreiben. Es spart Zeit (Sie müssen die Einstellungen der Tabellenansicht nicht ändern) und ist präziser. Bitte lesen Sie die Antwort von Mike Abdullah für eine detaillierte Erklärung.

HINWEIS: Dies ist die ordnungsgemäße und weniger unordentliche Implementierung, wie in der Antwort von Mike Abdullah beschrieben; wenn Sie preservesSuperviewLayoutMargins=NO für Ihre Zelle einstellen, wird sichergestellt, dass Ihre Tabellenansicht die Zelleinstellungen nicht überschreibt.

Erster Schritt - Konfigurieren Sie Ihre Zellenränder:

/*
    Informiert den Delegaten, dass die Tabelle eine Zelle für eine bestimmte Zeile zeichnet.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Separator-Einfügung entfernen
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }

    // Verhindern, dass die Zelle die Randeinstellungen der Tabellenansicht übernimmt
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }

    // Legen Sie ausdrücklich die Layoutränder Ihrer Zelle fest
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}

Das Einstellen der preservesSuperviewLayoutMargins-Eigenschaft auf NEIN für Ihre Zelle sollte verhindern, dass Ihre Tabellenansicht Ihre Zellenränder überschreibt. In einigen Fällen scheint es jedoch nicht richtig zu funktionieren.

Zweiter Schritt - Nur wenn alles scheitert, können Sie Ihre Tabellenansichtsränder notfalls erzwingen:

/*
    Wird aufgerufen, um den ViewController zu benachrichtigen, dass seine Ansicht gerade seine Unteransichten angeordnet hat.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Erzwingen Sie Ihre Tabellenansichtsränder (dies könnte keine gute Idee sein)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }

    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}

...und da haben Sie es! Dies sollte sowohl in iOS 8 als auch in iOS 7 funktionieren.

Hinweis: Getestet mit iOS 8.1 und 7.1, in meinem Fall musste ich nur den ersten Schritt dieser Erklärung verwenden.

Der zweite Schritt ist nur erforderlich, wenn Sie nicht ausgerichtete Zellen unterhalb der gerenderten Zellen haben, d.h. wenn die Tabelle mehr Zeilen hat als im Tabellenmodell definiert sind. Wenn der zweite Schritt nicht durchgeführt wird, würde dies zu unterschiedlichen Separator-Abständen führen.

39voto

swilliams Punkte 46488

In Swift ist es etwas lästiger, weil layoutMargins eine Eigenschaft ist. Daher müssen Sie den Getter und den Setter überschreiben.

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

Dadurch wird layoutMargins effektiv schreibgeschützt gemacht, was in meinem Fall in Ordnung ist.

24voto

Julian Punkte 9109

Für iOS 9 müssen Sie Folgendes hinzufügen:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 

Weitere Details finden Sie unter Frage.

21voto

Dan Beaulieu Punkte 18614

Swift 2.0 Erweiterung

Ich wollte nur eine Erweiterung teilen, die ich gemacht habe, um die Ränder von den Trennlinien der TableView-Zellen zu entfernen.

extension UITableViewCell {
    func removeMargins() {

        if self.respondsToSelector("setSeparatorInset:") {
            self.separatorInset = UIEdgeInsetsZero
        }

        if self.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
            self.preservesSuperviewLayoutMargins = false
        }

        if self.respondsToSelector("setLayoutMargins:") {
            self.layoutMargins = UIEdgeInsetsZero
        }
    }
}

Im Kontext verwendet:

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell

    cell.removeMargins()
    return cell

16voto

Alexander Volkov Punkte 7318

Swift:

override func viewDidLoad() {
    super.viewDidLoad()

    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }
    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }

    self.tableView.layoutIfNeeded()            // <--- das macht die Magie
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     ...

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }

    return cell
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X