Gruppierte UITableview entfernt äußere Trennlinie


77

Ich habe eine gruppierte UITableview, die programmgesteuert erstellt wird. Außerdem habe ich eine Zelle mit einer XIB-Datei, die ebenfalls programmgesteuert in der Tabellenansicht ausgefüllt ist. So weit, ist es gut. Ich möchte aber nur die äußere Trennlinie entfernen. Ich habe den folgenden Code verwendet, aber diesmal alle Trennlinien entfernt.

self.tableView.separatorColor = [UIColor clearColor];

Dies ist keine gute Option für meine Situation. Hier ist der Screenshot, was ich tun möchte;

Geben Sie hier die Bildbeschreibung ein


2
Option 1: Entfernen Sie alle Standardtrennzeichen und fügen Sie UIViews als gefälschte Trennzeichen in die Zelle ein. Hoffentlich gibt es eine bessere Option.
Lord Zsolt

Es ist der gleiche Ansatz wie oben. Wie ich bereits sagte, entferne ich nur die äußeren Mittel, die obere und untere Linie, nicht die innere Linie. Wenn ich alle Trennzeichen in der Tabellenansicht entferne und eine neue Zeile in die benutzerdefinierte Zelle einfüge, sieht die Tabellenansicht immer noch gleich aus.
Serhat Sezer

4
Die Lösung besteht darin, TableView als Plain tableviewnicht gruppiert zu verwenden. In Grouped werden in Kopf- und Fußzeilen Trennzeichen eingefügt.
Iphonic

@iphonic Ihre Lösung funktioniert, danke :), aber einfache Tabellenansicht zeigt immer noch Trennzeichen, auch wenn es nichts hat.
li2

19
Ist das dein Ernst, @iphonic?! Wem soll das helfen? li2? Wenn jemand eine gruppierte Tabellenansicht verwendet, gibt es höchstwahrscheinlich einen guten Grund dafür. Haben Sie jemals gesehen, dass die Trennzeichen nicht der einzige Unterschied zwischen gruppierter und einfacher tableView sind?
Julian F. Weinert

Antworten:


15

Ich habe gerade eine Lösung ausgearbeitet, da die Zelle eine contentViewist UIView, also denke ich, dass Sie sich nur auf das Endergebnis von konzentrieren können contentView.

Hier ist mein Code:

Zuerst müssen Sie das Trennzeichen löschen

tableView.separatorColor = UIColor.clear

Zweitens in der cellForRowAtFunktion:

let bottomBorder = CALayer()

bottomBorder.frame = CGRect(x: 0.0, y: 43.0, width: cell.contentView.frame.size.width, height: 1.0)
bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).cgColor
cell.contentView.layer.addSublayer(bottomBorder)

Hier sehen Sie die Benutzeroberfläche wie folgt:

Geben Sie hier die Bildbeschreibung ein


21

Hier ist meine Lösung:

self.tableView.separatorColor = self.tableView.backgroundColor

@xxtesaxx, du solltest einen echten Test haben


8
Es entfernt alle Trennzeichen
Tikhonov Alexander

5
@Brook Es wird alle Trennzeichen entfernen. Wenn Sie meine Frage lesen, sagte ich, ich wollte nur "äußere" Linien entfernen.
Serhat Sezer

2
@serhatsezer Ja, ich habe Ihre Frage gelesen. Dies ist eine Tricklösung. Sie lässt äußere Linien "verschwinden" und Trennlinien sichtbar halten.
Brook

@Brook Ein Problem tritt jedoch auf, wenn die Farbe des tableView-Hintergrunds von der Trennzeichenfarbe abweicht oder der TableView-Hintergrund dieselbe Farbe wie die Zellen hat. Sagen wir weiß.
Kautsya Kanu

21

Sie können Trennzeichen auch in gruppierten UITableView mit statischer Zelle entfernen:

class CustomCell: UITableViewCell {

override func layoutSubviews() {
    super.layoutSubviews()
    for view in subviews where view != contentView {
        view.removeFromSuperview()
    }
}

In iOS10 wird jedoch auch die Linie zwischen den Zellen in einem Abschnitt entfernt.
leo.tan

13

Google liefert diese Seite auch im Jahr 2018 als Top-Ergebnis für diese Frage. Ich hatte in iOS 11 kein Glück mit einer der bereitgestellten Antworten. Deshalb habe ich mir Folgendes ausgedacht:

extension UITableViewCell {
    func removeSectionSeparators() {
        for subview in subviews {
            if subview != contentView && subview.frame.width == frame.width {
                subview.removeFromSuperview()
            }
        }
    }
}

Durch Aufrufen von .removeSectionSeparators () in einer beliebigen UITableViewCell-Instanz wird das Problem jetzt behoben. Zumindest in meinem Fall sind die Abschnitts-Trennzeichen die einzigen mit der gleichen Breite wie die Zelle selbst (da die anderen alle eingerückt sind).

Die einzige Frage ist, woher wir sie nennen sollen. Sie würden denken, dass willDisplayCell die beste Wahl wäre, aber ich habe festgestellt, dass der erste Aufruf erfolgt, bevor die Trennzeichenansichten selbst generiert werden, also keine Würfel.

Ich habe dies in meine cellForRowAtIndexPath-Methode eingefügt, kurz bevor ich eine neu geladene Zelle zurückgebe:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyReusableIdentifier", for: indexPath)

    Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
        cell.removeSectionSeparators()
    }

    return cell
}

Es fühlt sich nicht so elegant an, aber ich bin noch auf keine Probleme gestoßen.

EDIT: Sieht so aus, als ob wir das auch brauchen (für wiederverwendete Zellen):

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.removeSectionSeparators()
}

Hier ist ein Vorher / Nachher in Screenshots mit diesem Code:

Vor Vor dem Entfernen des Separators

Nach Nach dem Entfernen des Separators


1
Funktioniert wie ein Zauber, danke. Funktioniert noch besser, wenn Sie es in Layout-Unteransichten für Ihre benutzerdefinierte Klasse
aufrufen

1
Dies ist das einzige, was ich finden konnte, das ab iOS 11 funktioniert. Vielen Dank.
jstr

9

Nach der Überprüfung der Ansichtshierarchie scheint jede UITableViewCell nur drei Unteransichten zu haben: die Inhaltsansicht ( UITableViewCellContentView) und zwei Trennzeichenansichten ( _UITableViewCellSeparatorView). Ich bin kein Fan der dynamischen Klasseninstanziierung von NSStrings (und Apple auch nicht). Da auf das contentViewof a UITableViewCelljedoch ohne Verwendung privater APIs zugegriffen werden kann, ist die Lösung recht einfach.

Die Idee ist nur, durch die Unteransichten von Ihnen zu iterieren UITableViewCellund alle Ansichten zu entfernen, die nicht die folgenden sind contentView:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let subviews = cell.subviews
    if subviews.count >= 3 {
        for subview in subviews {
            if subview != cell.contentView {
                subview.removeFromSuperview()
                break
            }
        }
    }
}

tableView(:willDisplayCell:forRowAtIndexPath:)wird beim Rendern von Tabellenansichten mehrmals aufgerufen, sodass der Status den Status verfolgt, indem überprüft wird, wie viele Unteransichten die Zelle hat. Wenn drei Unteransichten vorhanden sind, sind beide Trennzeichen noch intakt. Es wird auch nur eines der Trennzeichen entfernt, aber Sie können beide entfernen, indem Sie das entfernen break. Sie können auch angeben, ob das obere oder das untere Trennzeichen entfernt werden soll, indem Sie den Rahmen der Unteransicht überprüfen. Wenn der Ursprung der y-Achse des Rahmens ist 0, ist dies das obere Trennzeichen. Wenn nicht 0, ist es der Boden.

Hoffe das hilft!

Swift 4, Swift 4.2 Update:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let subviews = cell.subviews
    guard subviews.count >= 3 else {
        return
    }

    for subview in subviews where NSStringFromClass(subview.classForCoder) == "_UITableViewCellSeparatorView" {
        subview.removeFromSuperview()
    }
}

1
Vielen Dank, aber dieser Ansatz kann bei zukünftigen iOS-Versionen problematisch sein.
Serhat Sezer

2
Höchstwahrscheinlich nicht, es sei denn, Apple ändert die interne Struktur von Tabellenansichten so, dass sie mehrere Inhaltsansichten enthält. Wenn Sie noch vorsichtiger sein wollen, können Sie alternativ verwenden NSStringFromClassdiese Werte gegen und vergleichen "_UITableViewCellSeparatorView"und "UITableViewCellContentView"dann entfernen.
Dan Loewenherz

2
Apple hat die tableViewCell-Ansichtshierarchie von iOS 7 auf iOS 8 geändert. Es hat mich bei einem Projekt wirklich verbrannt, weil ich Code wie diesen verwendet habe. Daher würde ich empfehlen, dies nicht so zu tun.
Robert Bentley

Wenn Sie Bedenken hinsichtlich Veralterung oder interner Änderungen haben, würde ich empfehlen, das #availableAttribut mit einem leeren Text für jede Version von iOS zu verwenden, die größer als die aktuelle Version ist.
Dan Loewenherz

8

Zum Entfernen des oberen und unteren Teils der Trennlinie für jeden Abschnitt. Fügen Sie dies Ihrer statischen Zelle hinzu.

override func layoutSubviews() {
    super.layoutSubviews()

    //Get the width of tableview
    let width = subviews[0].frame.width

    for view in subviews where view != contentView {
        //for top and bottom separator will be same width with the tableview width
        //so we check at here and remove accordingly
        if view.frame.width == width {
            view.removeFromSuperview()
        }
    }
}

Ergebnis wie unten abgebildet

Geben Sie hier die Bildbeschreibung ein


Perfekte Antwort, aber können wir dies für nicht benutzerdefinierte Zellen erreichen?
Vishwas Singh

1
Dies war die einzige Lösung, die für mich funktioniert hat. Vielen Dank!
Matt

6

Das ist eine wirklich alte Frage, dennoch ist es einer der ersten Einträge bei Google, wenn nach der Entfernung der oberen und unteren Trennzeichen für jeden Abschnitt gesucht wird.

Nach einigen Nachforschungen fand ich heraus, dass es keine Möglichkeit und keine Absicht von Apple gibt, dies irgendwie ohne dumm komplizierte Hacks der Ansichtshierarchie zu erreichen.

Glücklicherweise gibt es einen absolut einfachen und einfachen Weg, um einen solchen Look zu erzielen:

Geben Sie hier die Bildbeschreibung ein

Ich sage einfach, aber für einen Anfänger kann dies schwierig sein, da er nicht versteht, wie es UITableViewfunktioniert und wie man eigene Zellen implementiert. Lassen Sie mich versuchen, es zu erklären:

  1. Erstellen Sie eine UITableViewCellUnterklasse
  2. Erstellen Sie in Ihrer Zelle eine @IBOutlet weak var separatorView: UIView!Eigenschaft
  3. Wählen Sie in Ihrem Storyboard die Tabellenansichtszelle aus und wählen Sie Ihre eigene Zelle als Klasse aus, die die Zelle sichert. Hinweis : Sie müssen keinen benutzerdefinierten Stil verwenden. Sie können weiterhin Basic, Untertitel usw. verwenden.
  4. Stellen Sie Ihr UITableViews Separator Styleauf ein None, um das Standardtrennzeichen auszublenden
  5. Ziehen Sie a UIViewauf Ihre Zelle und ändern Sie die Größe so, dass es sich unten (oder oben) in der Zelle befindet. Verwenden Sie das Size Inspectors Autoresizing, um es an Start / Ende / unten zu stecken und ihm eine flexible Breite zu geben (oder Autolayout, aber das ist in diesem Fall etwas übertrieben).
  6. Verbinden Sie die Ansicht mit dem Ausgang Ihrer Zellklasse
  7. In Ihrem UITableViewDataSources cellForRowAtIndexPath:legen Sie die isHiddenEigenschaft Ihres benutzerdefinierten Trennzeichens fest, basierend darauf, ob dies die indexPath.rowletzte Zeile (oder die erste, wenn sich Ihre Ansicht oben befindet) im Abschnitt ist

Hier ist ein Beispielcode:

class MyCell: UITableViewCell {
    @IBOutlet weak var separatorView: UIView!
}

class ViewController: UITableViewController {


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCell
        cell.separatorView.isHidden = indexPath.row == 2
        return cell
    }

}

Und hier einige Screenshots:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ja, es ist eine Arbeit, aber es gibt einfach keine Möglichkeit, beim Codieren etwas umsonst zu machen. Am Ende sind wir Programmierer und es liegt an uns, die Codierung durchzuführen. Es ist immer besser, die 5-10 Minuten damit zu verbringen, dies einzurichten, als nur das Einfügen von Hacky-Code zu kopieren, der möglicherweise in Zukunft nicht mehr funktioniert, wenn Apple beschließt, die Ansichtshierarchie zu ändern.

Es war tatsächlich mehr Arbeit, diese Antwort zu schreiben, als das Trennzeichen zu implementieren. Ich war auch auf der Suche nach einer einfachen und schnellen Lösung, aber am Ende gab es einfach keine, die meiner Meinung nach die Verwendung wert war.

Ich hoffe, Sie sind auch skeptisch, wenn Sie For-Loops sehen, die über Unteransichten von Zellen iterieren, um Ansichten zur Laufzeit aus der Ansichtshierarchie auszublenden oder sogar zu entfernen. Apple bietet Ihnen eine einfache, vielseitige, stabile und zukunftssichere Lösung gleich um die Ecke . 7 kleine Schritte sind wirklich alles was Sie brauchen und sie sind leicht zu verstehen.


Funktioniert Ihre Lösung mit der Zubehöransicht oder dem Standardzubehör von UITableViewCell (Chevrons, Info-Schaltflächen usw.)?
iur

Da Sie Standardstile verwenden können und nicht gezwungen sind, benutzerdefinierte Stile zu verwenden, sollte es meiner Meinung nach problemlos funktionieren, das Standardzubehör zu verwenden.
Xxtesaxx

Ich habe es versucht und konnte das Trennzeichen im Interface Builder nicht unter Chevron anzeigen lassen. Gerät aber nicht anprobiert. Der Grund dafür - xcode ermöglicht das Hinzufügen von Ansichten nur zur contentView der Zelle. Chevron ist Teil der Zubehöransicht, die neben der Inhaltsansicht angezeigt wird.
iur

In diesem Fall haben Sie mehrere Möglichkeiten. Sie können die Trennansicht einfach nach rechts erweitern, sodass sie zunächst teilweise nicht sichtbar ist. Wenn die Inhaltsansicht dann nach links verschoben wird, ist der vorherige nicht sichtbare Teil jetzt sichtbar. Nicht mein Favorit, aber es funktioniert. Dann können Sie Autolayout in Kombination mit einer benutzerdefinierten Tabellenansichtszellenklasse verwenden. Befestigen Sie den Seprartor unten und an der Spitze der Inhaltsansicht, aber am Ende der Zelle. Auf diese Weise erstreckt sich das Trennzeichen auch dann, wenn die Inhaltsansicht kontrahiert ist, bis zum Ende.
Xxtesaxx

3

Das habe ich mir endlich ausgedacht:

Geben Sie hier die Bildbeschreibung ein

Ich konnte keinen besseren Weg finden. Aber es funktioniert sehr gut für mich. Zuletzt versucht mit Xcode Version 7.3.1 (7D1014). Dieser Vorgang wurde über das Storyboard durchgeführt.

Grundsätzlich füge ich der UITableViewCell eine UIView mit einer Höhe von 0,5 pt hinzu und lege dann eine Hintergrundfarbe für diese UIView fest. Setzen Sie das Trennzeichen des übergeordneten UITableView auf Keine.

Hier sind die Details:

Wenn Sie Ihre UITableViewCell bereits als benutzerdefiniert oder standardmäßig festgelegt haben. Setzen Sie in der ersten Phase das Trennzeichen von UITableView auf Keine.

Geben Sie hier die Bildbeschreibung ein

Fügen Sie als Nächstes eine UIView mit einer Höhe von 1 Punkt hinzu und stellen Sie den Hintergrund nach Bedarf ein. In meinem Fall ist er Rot.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Beginnen Sie mit dem Festlegen der Einschränkungen. Das Problem besteht darin, die Höhe des UIView auf 0,5 pt einzustellen. Dies ist das einzige problematische Problem für diesen Workflow.

UIView mit 0,5 pt Höhe:

Teilen Sie den Weg, um die Höhe von 0,5 pt des UIView festzulegen.

Zuerst (1) die Ansicht fixieren und dann (2) die Höhe auf 0,5 einstellen. Drücken Sie Enter.

Geben Sie hier die Bildbeschreibung ein

Schließlich sieht Ihr UIView wie folgt aus.

Geben Sie hier die Bildbeschreibung ein

Ich konnte die Höhe nur auf diese Weise auf 0,5 einstellen.


2

Hier die Lösung. Dies gilt für statische Zellen. Wenn Sie dynamisch sein möchten, schreiben Sie einfach "count" neu. Ich hoffe es hilft.

extension NSObject {
   var theClassName: String {
       return    NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
   }
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.separatorStyle = .None
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let count = tableView.numberOfRowsInSection(indexPath.section)
    if ( indexPath.row != count - 1 ) {
        for view in cell.subviews {
            if view.theClassName == "_UITableViewCellSeparatorView" {
                view.backgroundColor = UIColors.redColor()
            }
        }
    }
}

1
Das sieht nach einer schrecklich komplizierten Lösung aus. Wenn Sie eine statische Tabellenansicht haben, setzen Sie das Trennzeichen auf "Keine" und fügen Sie den statischen Zellen, in denen Sie sie haben möchten, einige benutzerdefinierte Ansichten mit einer Höhe von 1p hinzu.
Xxtesaxx

Ehrlich gesagt bin ich kein großer Fan der Optimierung im Rahmen von iOS, da sie später geändert werden kann. Daher liegt möglicherweise ein Problem mit der freigegebenen Anwendung vor.
Serhat Sezer

1

Versuchte verschiedene Lösungen basierend auf der cell.separatorInset = UIEdgeInsetsMake()Problemumgehung, von denen keine richtig funktionierte.

Für mein iOS11- UITableViewStyleGroupedbasiertes Projekt hat dies Folgendes bewirkt :

self.tableView.separatorColor = self.tableView.backgroundColor;

1

Basierend auf der Antwort des Kochs, aber ohne Timer:

override func didAddSubview(_ subview: UIView) {
    super.didAddSubview(subview)
    if NSStringFromClass(subview.classForCoder) != "UITableViewCellContentView" && subview.frame.width == frame.width {
        subview.removeFromSuperview()
    }
}

Fügen Sie dies einfach in die Unterklasse einer Zelle ein und Sie brauchen nichts anderes. Funktioniert unter iOS 12.


1

iOS 13, Swift 5

In der benutzerdefinierten Zellenklasse:

override func layoutSubviews(){
    super.layoutSubviews()

    for subview in subviews where (subview != contentView && abs(subview.frame.width - frame.width) <= 0.1 && subview.frame.height < 2) {
        subview.removeFromSuperview()                           //option #1 -- remove the line completely
        //subview.frame = subview.frame.insetBy(dx: 16, dy: 0)  //option #2 -- modify the length
    }
}

Ich möchte @cook für diese Lösung danken, die ich darauf aufgebaut habe. Ich hatte einige Probleme mit ihrer Lösung:

  1. Es wurde die Standard-Hervorhebung / ausgewählte Hintergrundansicht entfernt, daher habe ich die Höhe der Unteransicht zusätzlich überprüft.
  2. Ich habe meinen Code eingegeben layoutSubviews()und hatte kein einziges Problem.
  3. Ich habe eine Annäherung zwischen zwei CGFloats implementiert, anstatt den Gleichheitsoperator zu verwenden ==, was für mich fehleranfällig klingt.

Ich habe die "Option 2" in den Code eingefügt, da dies die Lösung ist, nach der ich persönlich gesucht habe (ich wollte das Trennzeichen beibehalten, aber ich wollte, dass es auf der gleichen Einrückungsstufe wie die regulären Zellentrennzeichen ist, in meinem Fall a Wert von 16).


0

Ich hatte ein ähnliches Problem, bei dem ich eine gruppierte UITableView mit benutzerdefinierten Zellen hatte, die alle mit Interface Build als .xib-Dateien entworfen wurden. Die Zellen hatten einen weißen Hintergrund, entfernten die Standardtrennzeichen und fügten meine eigenen hinzu. Ich hatte auch benutzerdefinierte Header-Ansichten für jeden Abschnitt. Ich habe die Höhe dieser Header-Ansichten auf 44 festgelegt (kann alles sein ...). Zwischen meinen Abschnitten befand sich eine Ansicht mit einer Höhe von 1 Punkt, was seltsam schien. Anscheinend fügt das System zwischen den Abschnitten eine klare Hintergrundansicht hinzu, selbst wenn wir die benutzerdefinierte Höhe auf 44 festlegen und die von uns zurückgegebene benutzerdefinierte Kopfzeilenansicht ein Weiß (oder eine konkrete Hintergrundfarbe) aufweist. Die Farbe, die wir hinter dieser klaren Ansicht sehen, ist die Farbe des Hintergrunds der Tabellenansicht. In meinem Fall mussten sowohl die Tabellenansichten als auch die Zellen eine weiße Farbe haben. und das Setzen des Hintergrunds der Tabellenansicht auf Weiß löste das Problem (zumindest visuell, aber das wollte ich trotzdem). Die zweite Lösung wäre, den Stil der Tabellenansicht einfach zu halten, aber die UITableView-Delegatenmethode zu implementieren, um zwei oder mehr Abschnitte zurückzugeben, und bei Bedarf auch benutzerdefinierte Header zu erstellen. Dadurch bleiben die Header-Ansichten für eine Weile (während des Bildlaufs) oben, bis sich die Header-Ansicht des nächsten Abschnitts nähert, und dann steigt sie ebenfalls an (und das ist möglicherweise nicht das, was Sie wirklich wollen, aber dort kann ein einfacher Weg sein, dies zu beheben, aber nicht sicher).


0

Sie können mit auf die Ansicht zugreifen

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    let header = view as! UITableViewHeaderFooterView 
    header.backgroundView . .....

0

Versuchen Sie dies, um die obere Trennlinie zu entfernen.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 0 && indexPath.section == 0) {
        for (UIView *view in  cell.subviews) {
            if ([NSStringFromClass([view class]) containsString:@"CellSeparator"]) {
                if (view.frame.origin.y == 0 && CGRectGetHeight(view.frame) < 1.01 ) { //Hide first UITableViewCellSeparatorView
                    NSLog(@"%s Remove View From Cell[Section:0 Row:0] for top border [%@]:%@",__FUNCTION__,NSStringFromClass([view class]),view);
                    view.hidden = YES; //Hide
                }
            }
        }
    }
}


0

iOS 10 ~ 13 entfernt nur die Kopfzeile des Abschnitts.

-(void)layoutSubviews{
    [super layoutSubviews];
    //for iOS10~iOS13: only remove section head foot line
    for (UIView * v in self.subviews) {
        if ( v != self.contentView &&
            (v.frame.size.width == self.frame.size.width)){
            [v removeFromSuperview];
        }
    }
}

Wenn Sie alle Zeilen entfernen möchten:

    for (UIView * v in self.subviews) {
        if (v != self.contentView){
            [v removeFromSuperview];
        }
    }

0
 override func layoutSubviews() {
    super.layoutSubviews()
    subviews.filter { $0 != contentView && $0.frame.width == frame.width }.first?.removeFromSuperview()
}

3
Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie auch eine Erklärung, was Ihr Code tut und wie er das Problem der Frage löst. Antworten mit einer Erklärung sind in der Regel hilfreicher und von besserer Qualität und ziehen eher positive Stimmen an.
Matt D

-1

Hier ist eine Swift-Lösung, die unter iOS 8 und 9 funktioniert.

Definieren Sie ein Protokoll mit einer Standardimplementierung:

protocol CellSeparatorRemovable { }

extension CellSeparatorRemovable {
    func removeSeparatorLinesFromCell(cell: UITableViewCell, section: Int, row: Int, indexPath: NSIndexPath) {
        guard (section, row) == (indexPath.section, indexPath.row) else { return }

        for view in cell.subviews where view != cell.contentView {
            view.removeFromSuperview()
        }
    }
}

Passen Sie dann, wo immer Sie es verwenden möchten, das CellSeparatorRemovableProtokoll an und rufen Sie seine Methode auf von …willDisplayCell…:

class SomeVC: UITableViewController, CellSeparatorRemovable {
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        removeSeparatorLinesFromCell(cell, section: 1, row: 1, indexPath: indexPath)
    }
}

Dies ist eine minimale Lösung; Möglicherweise müssen Sie es umgestalten, wenn Sie mit vielen Zellen arbeiten, um Probleme mit übermäßiger Rekursion und / oder Wiederverwendung von Zellen zu vermeiden.


Hallo @Aaron, ich habe Ihre Lösung ausprobiert, aber das Trennzeichen verschwindet erst, wenn die Zelle neu gezeichnet wird (wenn Sie scrollen und der Bildschirm verlassen und dann zurück scrollen), aber beim ersten Laden des Bildschirms ist das Trennzeichen vorhanden. Ich habe versucht, cell.setNeedsLayout () und cell.setNeedsDisplay (). Irgendeine Idee, wie man es löst?
PMT

1
Am Ende musste ich UITableViewCell unterordnen und layoutSubviews ()
PMT

2
Das Hacken der Ansichtshierarchie ist wahrscheinlich keine gute Lösung. Es kann sich jederzeit ändern. Es ist auch keine benutzerdefinierte Zeichnung erforderlich. Bitte
lesen
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.