Beseitigen Sie zusätzliche Trennzeichen unterhalb von UITableView

714

Wenn ich eine Tabellenansicht mit 4 Zeilen einrichte, befinden sich unter den gefüllten Zeilen noch zusätzliche Trennlinien (oder zusätzliche leere Zellen).

Wie würde ich diese Zellen entfernen?

Bild für zusätzliche Trennlinien in UITableView

RoundOutTooSoon
quelle

Antworten:

1505

Interface Builder (iOS 9+)

Ziehen Sie einfach eine UIView auf die Tabelle. Im Storyboard befindet es sich oben unter Ihren benutzerdefinierten Zellen. Sie können es vorziehen, es "Fußzeile" zu nennen.

Hier wird es aus Gründen der Klarheit grün angezeigt. Sie möchten wahrscheinlich eine klare Farbe.

Beachten Sie, dass Sie durch Anpassen der Höhe beeinflussen können, wie der "untere Sprung" der Tabelle nach Ihren Wünschen behandelt wird. (Höhe Null ist normalerweise in Ordnung).

Geben Sie hier die Bildbeschreibung ein


So programmgesteuert:

Schnell

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Ziel c

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

oder wenn Sie es vorziehen,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Historisch in iOS:

Zum Table View Controller hinzufügen ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

und wenn nötig ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
quelle
Ich denke, Ihre Beschreibungen und Ihr Code sind umgekehrt. Wie auch immer, das hat großartig für mich funktioniert. Ich verwende nur "echte" Fußzeilen mit gruppierten Tabellen, daher habe ich if (tableView.style! = UITableViewStyleGrouped) {} ​​um Ihren Code hinzugefügt. Jetzt verlieren alle meine nicht gruppierten Tabellen ihre zusätzlichen Zellen, während meine gruppierten Tabellen nicht betroffen sind.
Arlomedia
Nach meinem obigen Hinweis füge ich eine Warnung hinzu: Wenn Sie Bedingungen in die viewForFooterInSection-Methode einfügen, stellen Sie sicher, dass die Methode entweder eine UIView oder eine Null zurückgibt. Wenn Sie versehentlich ungültig zurückkehren, stürzt Ihre App ab!
Arlomedia
4
@Mathieu Dies funktioniert, da bei einer benutzerdefinierten Fußzeile der Tabelle keine "Fantom" -Zeilen erstellt werden, um die Tabellenansicht zu füllen. Sie erstellen also eine leere Ansicht, die als Fußzeile verwendet werden soll, und setzen die Höhe auf nahe 0 (sie kann nicht Null sein oder wird von iOS nicht gerendert). Mit diesem einfachen Trick ändern Sie das Standardverhalten.
J. Costa
2
@ j.Costa: Ihre Lösung funktioniert nur einmal, während uitableview erstellt wird. Nach dem Klicken auf die letzte Zelle ist Ihre Lösung nicht mehr gut. Bitte verbessern Sie Ihre Antwort.
3
Bei Verwendung von tableFooterViewbleibt ein Trennzeichen in der letzten Zelle in der Zeile, da die Tabelle weiterhin Inhalte unterhalb dieser Zelle vorwegnimmt. Wenn Sie den historischen Weg verwenden, wird das letzte Trennzeichen entfernt und sieht insgesamt besser aus.
James Kuang
128

Hier ist eine andere Möglichkeit, dies ohne den gruppierten Tabellenstil zu tun, und eine, die Sie wahrscheinlich nicht erraten würden. Durch Hinzufügen einer Kopf- und Fußzeile zur Tabelle (möglicherweise reicht die eine oder andere aus, wurde nicht überprüft) werden die Trennzeichen aus den Füll- / Leerzeilen entfernt.

Ich bin darauf gestoßen, weil ich oben und unten auf den Tischen etwas Platz haben wollte, um das Risiko zu verringern, Knöpfe anstelle einer Tischzelle mit fleischigen Fingern zu drücken. Hier ist eine Methode, um eine leere Ansicht als Kopf- und Fußzeile einzufügen. Verwenden Sie eine beliebige Höhe, um die zusätzlichen Trennlinien zu entfernen.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

Als Antwort auf @Casebash kehrte ich zum Code in meiner App zurück ("AcmeLists" -Listenmanager im iTunes Store ...) und schloss die Methode addHeaderAndFooter kurz, um dies zu überprüfen. Ohne es habe ich die zusätzlichen Zeilentrennzeichen; Mit dem Code habe ich, was Sie in diesem Fenster sehen, Snap: kein Bild mit Tabellenzeilentrennzeichen . Ich bin mir also nicht sicher, warum es bei Ihnen nicht funktioniert hätte. Darüber hinaus ist es für mich sinnvoll, dass für eine benutzerdefinierte Fußzeile in einer Tabellenansicht nicht mehr Zeilentrennzeichen für leere Zeilen darunter gezeichnet werden müssen. Das wäre schrecklich. Als Referenz habe ich mir Tabellen angesehen, in denen mehr Zeilen vorhanden waren, als auf dem Bildschirm angezeigt werden konnten, und dann eine Tabelle mit zwei Zeilen. In beiden Fällen keine Fremdabscheider.

Möglicherweise wurden Ihre benutzerdefinierten Ansichten nicht hinzugefügt. Um dies zu überprüfen, stellen Sie die Hintergrundfarbe auf etwas anderes als clearColorz [UIColor redColor]. Wenn Sie am unteren Rand der Tabelle keine roten Balken sehen, wurde Ihre Fußzeile nicht festgelegt.

wkw
quelle
1
Sie können dies auch in IB tun. Ziehen Sie einfach eine UIView am unteren Rand der TableView und stellen Sie die Höhe auf 1 ein.
Ortwin Gentz
70

Entfernen zusätzlicher Trennlinien für leere Zeilen in UITableView in Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
Dineshthamburu
quelle
34

Ich möchte die wkw- Antwort erweitern:

Das einfache Hinzufügen nur einer Fußzeile mit der Höhe 0 reicht aus. (getestet auf sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

oder noch einfacher - wo Sie Ihre Tabellenansicht einrichten, fügen Sie diese Zeile hinzu:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

oder noch einfacher - um Trennzeichen einfach zu entfernen:

[_tableView setTableFooterView:[UIView new]];

Nochmals vielen Dank an wkw :)

Guntis Treulands
quelle
Dies ist die richtige Antwort, denn in anderen Methoden bleibt die letzte Zeile ohne Zeilentrenner
Ankush
22

Für iOS 7+ mit Storyboards

Ziehen UIViewSie einfach ein in Ihre UITableViewals Fußzeile. Stellen Sie die Höhe der Fußzeilenansicht auf 0 ein.

Kyle Clegg
quelle
18

Versuche dies. Es hat bei mir funktioniert:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
Ambili B Menon
quelle
14

Für Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Sebastian
quelle
11

Wenn Sie Swift verwenden, fügen Sie viewDidLoad des Controllers, der die Tabellenansicht verwaltet , den folgenden Code hinzu :

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Babatunde Adeyemi
quelle
8

Sie können am Ende einfach eine leere Fußzeile hinzufügen, dann werden die leeren Zellen ausgeblendet, aber es sieht auch ziemlich hässlich aus:

tableView.tableFooterView = UIView()

Geben Sie hier die Bildbeschreibung ein

Es gibt einen besseren Ansatz: Fügen Sie am Ende der Tabellenansicht eine 1-Punkt-Linie hinzu, da die Fußzeile und die leeren Zellen ebenfalls nicht mehr angezeigt werden.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

Geben Sie hier die Bildbeschreibung ein

Darko
quelle
Sehr schöne Eingabe, jedoch müssen Sie Ihre letzte Zelle nicht mit einer dicken Trennfarbe unten erstellen, sondern müssen nur die gleiche Hintergrundfarbe wie die Zelle haben, und sie verschwindet auch.
Gustavo Baiocchi Costa
Wie auch immer Sie bevorzugen. Aber ich denke, das irgendwie "nicht abgeschlossene" Trennzeichen sieht ziemlich hässlich aus.
Darko
7

Fügen Sie einfach diesen Code hinzu ( Swift ). .

tableView.tableFooterView = UIView()
Roy
quelle
1
Duplikat vieler Antworten, einschließlich der Top-Wiki-Antwort und der Sebastian-Antwort
Cœur
7

Weiterentwicklung der Lösung von J. Costa: Sie können eine globale Änderung an der Tabelle vornehmen, indem Sie diese Codezeile einfügen:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

innerhalb der ersten möglichen Methode (normalerweise in AppDelegate, in: application:didFinishLaunchingWithOptions:Methode).

o.shnn
quelle
2
Seien Sie vorsichtig mit diesem, es gibt Fälle, in denen Ihre beabsichtigte Fußzeile überschrieben werden kann und Sie ein oder zwei Tage damit verbringen, Ihre geistige Gesundheit in Frage zu stellen. Außerdem ist tableFooterView nicht mit UI_APPEARANCE_SELECTOR markiert, sodass sich das tatsächliche Verhalten jederzeit ändern kann.
Mwright
6

Ich weiß, dass diese Frage als Antwort akzeptiert wurde, aber ich habe hier verschiedene Möglichkeiten angegeben, wie die zusätzliche Trennlinie von ausgeblendet werden kann UITableView.

Sie können die tableViewStandardtrennlinie ausblenden und Ihre benutzerdefinierte Linie oben in jede Zelle einfügen.

Aktualisieren:

Der einfachste Weg, ein benutzerdefiniertes Trennzeichen hinzuzufügen, besteht darin, ein einfaches UIViewTrennzeichen mit einer Höhe von 1 Pixel hinzuzufügen :

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

ODER

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

ODER

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

ODER Der beste und einfachste Weg, den ich je mag, ist

self.tableView.tableFooterView = [[UIView alloc] init];

Probieren Sie eines aus.

iPatel
quelle
6

Möglicherweise finden Sie viele Antworten auf diese Frage. Die meisten von ihnen befassen sich mit der Manipulation mit UITableViewdem tableFooterViewAttribut 'und dies ist der richtige Weg, um leere Zeilen auszublenden. Der Einfachheit halber habe ich eine einfache Erweiterung erstellt, mit der leere Zeilen in Interface Builder ein- und ausgeschaltet werden können. Sie können es aus dieser Hauptdatei auschecken . Ich hoffe, es könnte ein wenig Zeit sparen.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Verwendungszweck:

tableView.isEmptyRowsHidden = true

Geben Sie hier die Bildbeschreibung ein

Stanislau Baranouski
quelle
5

uitableview zusätzliche Trennlinie zusätzliche Trennlinien ausblenden in Swift 3.0 ausblenden

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
quelle
5

Wenn Sie nach der letzten Zelle kein Trennzeichen mehr benötigen, benötigen Sie für Ihre Fußzeile eine Höhe nahe Null, jedoch nicht Null.

In Ihrem UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Cœur
quelle
1
hervorragend! Hat für mich gearbeitet !!
Antony Raphel
5

Swift funktioniert hervorragend mit:

tableView.tableFooterView = UIView()
Marcelo Gracietti
quelle
3

Fügen Sie Ihrer tableViewCell einfach eine Ansicht mit der gewünschten Trennfarbe als Hintergrundfarbe, 100% Breite, 1 Pixel Höhe an der Position x0 y-1 hinzu. Stellen Sie sicher, dass die tableViewCell keine Unteransichten schneidet, sondern die tableView.

Sie erhalten also ein absolut einfaches und funktionierendes Trennzeichen nur zwischen vorhandenen Zellen ohne Hack pro Code oder IB.

Hinweis: Bei einem vertikalen Top-Bounce wird das 1. Trennzeichen angezeigt. Dies sollte jedoch kein Problem darstellen, da dies das Standardverhalten von iOS ist.

Maaalex
quelle
3

Ich habe eine Tabellenansicht verwendet, um eine feste Anzahl von Zeilen mit fester Höhe anzuzeigen. Daher habe ich die Größe einfach geändert und sie nicht scrollbar gemacht.

Casebash
quelle
3

Um zusätzliche Trennzeilen programmgesteuert am unteren Rand von UItableview zu entfernen, schreiben Sie einfach die folgenden zwei Codezeilen auf, um zusätzliche Trennzeichen zu entfernen.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Dieser Trick funktioniert die ganze Zeit für mich, versuchen Sie es selbst.

Kalpesh Panchasara
quelle
2

Ich hatte etwas Glück bei der Implementierung eines einzelnen Teils der akzeptierten Antwort (iOS 9+, Swift 2.2). Ich hatte versucht zu implementieren:

self.tableView.tableFooterView = UIView(frame: .zero)

Es gab jedoch keine Auswirkungen auf meine tableView- ich glaube, es könnte etwas mit der Tatsache zu tun haben, dass ich verwendet habe UITableViewController.

Stattdessen musste ich nur die viewForFooterInSectionMethode überschreiben (ich habe die nicht tableFooterViewanderswo festgelegt):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Dies funktionierte gut für einen tableVieweinzelnen Abschnitt (wenn Sie mehrere Abschnitte haben, müssen Sie den letzten angeben).

BAP
quelle
2

Wenn Sie nur einen Abschnitt haben, können Sie am schnellsten und einfachsten den Tabellenansichtsstil von "Einfach" auf "Gruppiert" einstellen. (siehe Bild)

TableView gruppiert

Wenn Sie mehr Abschnitte haben, müssen Sie möglicherweise die Headerhöhe auf Null setzen (abhängig vom Geschmack Ihres / Ihres Kunden / Ihres Projektmanagers).

Wenn Sie mehr Abschnitte haben und sich nicht mit den Überschriften herumschlagen möchten (auch wenn es im einfachsten Fall nur eine Zeile ist), müssen Sie eine UIView als Fußzeile festlegen, wie in den vorherigen Antworten erläutert.

Gefilte Fisch
quelle
2

Swift 4.0-Erweiterung

Nur eine kleine Erweiterung für das Storyboard:

Geben Sie hier die Bildbeschreibung ein

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Nik Kov
quelle
2

Schnell und einfach Swift 4 Way.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Wenn Sie statische Zellen haben. Sie können das Trennzeichen auch im Inspektorfenster deaktivieren. (Dies ist nicht wünschenswert, wenn Sie das Trennzeichen benötigen. Verwenden Sie in diesem Fall die oben gezeigte Methode.) Inspektorfenster

Alix
quelle
Das Festlegen einer neuen UIView auf tableFooterView wurde bereits 10 Mal beantwortet, mit besseren Erklärungen zum Warum, besserem Code (Sie fehlen super.viewDidLoad()) und ist in der Wiki-Antwort oben enthalten. Das Entfernen aller Trennzeichen ist nicht das, worum es bei dieser Frage geht. Setzen Sie also Ihre letzte Bearbeitung besser zurück und / oder löschen Sie Ihre Antwort vollständig.
Cœur
1

Wenn Sie unerwünschten Speicherplatz in UITableview entfernen möchten, können Sie die folgenden zwei Methoden verwenden

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Hari c
quelle
1

Ich habe diese kleine Tabellenansicht-Erweiterung hinzugefügt, die überall hilft

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Suresh Varma
quelle
1

Versuchen Sie es damit

für Ziel C.

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

für Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Atanu Mondal
quelle
0

Versuche dies

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
vishnu
quelle
0

UIKiterstellt keine leere Zelle, wenn die tableVieweine hat tableFooterView. So können wir einen Trick machen und ein UIViewObjekt mit einer Höhe von Null als Fußzeile des zuweisen tableView.

tableView.tableFooterView = UIView()
iMuzahid
quelle
0

Wenn Sie eine searchbarin Ihrer haben view(um beispielsweise die Anzahl der Ergebnisse zu begrenzen), müssen Sie in shouldReloadTableForSearchStringund auch Folgendes hinzufügenshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
user3900346
quelle
0

In Swift (ich verwende 4.0) können Sie dies erreichen, indem Sie eine benutzerdefinierte UITableViewCellKlasse und overridingdie setSelectedMethode erstellen . Dann das separator insetsalles auf 0 . (meine Hauptklasse mit der Tabellenansicht hat einen klaren Hintergrund) Farbe.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
hoptown
quelle