Wie entferne ich den letzten Rand der letzten Zelle in UITableView?

75

In meiner App verwende ich ein UITableView Mein Problem ist, dass ich den letzten Rand der letzten Zelle in entfernen möchte UITableView.

Bitte überprüfen Sie das folgende Bild:

Geben Sie hier die Bildbeschreibung ein

Arnaud
quelle
Ändern Sie separatorInset wie in dieser Antwort stackoverflow.com/a/8561820/1418457
onmyway133

Antworten:

25

Aktualisiert am 14.9.15. Meine ursprüngliche Antwort ist veraltet, aber es ist immer noch eine universelle Lösung für alle iOS-Versionen:

Sie können die tableViewStandardtrennlinie ausblenden und Ihre benutzerdefinierte Linie oben in jede Zelle einfügen. 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, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];

Bisher habe ich eine andere Möglichkeit zum Ausblenden zusätzlicher Trennzeichen unter Zellen abonniert (funktioniert für iOS 6.1+):

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
onegray
quelle
6
Die CGRectZero-Methode hat bei mir nicht funktioniert. Die andere Antwort, die den Frame auf CGRectMake setzt (0, 0, self.tableView.frame.size.width, 1), hat jedoch funktioniert.
Ecuador
Geniale Antwort! hat meinen Tag gerettet.
Rohit Mandiwal
1
Ecuadors Kommentar ist richtig. Answer funktioniert unter iOS 12 nicht und sollte nicht als korrekt markiert werden, da nur die Trennzeichen aus leeren Zellen entfernt werden.
fl034
134

Die beste Lösung ist das Hinzufügen einer Fußzeilenansicht. Der folgende Code verbirgt die Zeile der letzten Zelle perfekt:

Ziel c

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];

Swift 4.0

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
Tonny Xu
quelle
12
Funktioniert nur, wenn Sie einen Abschnitt haben
GoodSp33d
@ GoodSp33d Ich habe mehrere Abschnitte und es funktioniert so: if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1) { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)]; } In der CellForRowAtIndexPathDatenquelle
Josh Valdivieso
Mein schlechter Kommentar früh. Wenn Sie nur diese Zeile hinzufügen, wird die Standardhöhe auf 44 px festgelegt, also muss ich zusammen mit dieser Codezeile 1.0fals Fußzeilenhöhe im -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)sectionDelegaten übergeben werden. Jetzt funktioniert es wie ein Zauber. Upvoted
GoodSp33d
42

In iOS 7 gibt es eine einfachere Lösung. Angenommen, Zelle ist Ihre letzte Zelle:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
davidisdk
quelle
5
Dies verbirgt den gesamten Inhalt meiner Zellen. Beschriftung wird unsichtbar.
Karim
3
funktioniert nicht, es verschiebt nur das Etikett nach rechts.
SamChen
Funktioniert perfekt für mich unter iOS 7 mit einer nicht scrollenden Tabelle mit einer festen Anzahl von Zellen, wenn ich dies auf die unterste Zelle anwende.
klares Licht
Kann nicht mit "Standard" -Zellen verwendet werden, da der Einschub bestimmt, wo das Etikett positioniert ist. Kann mit Kundenzellen verwendet werden.
Matt
13

Dies funktioniert für mich in iOS 7 und 8:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));

HINWEIS: Seien Sie vorsichtig bei der Verwendung, tableView.boundsda manchmal der falsche Wert gemeldet wird, je nachdem, wann Sie ihn aufrufen. Siehe Melden falscher Grenzen im Querformat

Jamie Forrest
quelle
Funktioniert auch in iOS8 perfekt. Vielen Dank
Tim
1
Ich habe dies verwendet, um seltsames Verhalten auf 5,5-Zoll-Bildschirm zu vermeiden:cell!.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(self.tableView.bounds)-self.view.layoutMargins.left)
Camillo
Wenn die Ausrichtung zuerst im Hochformat, dann im
Querformat erfolgt
10

Fügen Sie diese Codezeile hinzu viewDidLoad().

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

Dadurch wird sichergestellt, dass das letzte Trennzeichen ersetzt wird und die ersetzte (unsichtbare) Fußzeilenansicht keine zusätzliche Höhe einnimmt. Da die Breite der Fußzeilenansicht von verwaltet wird UITableView, können Sie sie auf 0 setzen.

Jonny
quelle
Die einzige Lösung, die für mich funktioniert hat, war das .zerolinke Trennzeichen am Ende der Tabelle.
Ido
@Ido hallo, nur um dich wissen zu lassen, dass ich deine Bearbeitungsversion zurückgesetzt habe, weil ich nicht denke, dass die CGRectErweiterung, die du hinzugefügt hast, eine großartige Übung ist. Wenn Sie diese umständlichen 0im Beispielcode nicht mögen , können Sie so etwas schreiben:var frame = CGRect.zero \n frame.size.height = 0.001
Jonny
Darf ich fragen, warum es keine gute Praxis ist? Sie können die gleiche Methode verwenden, mit der Sie arbeiten können .zero, aber die tatsächliche Null (0,001) verwenden, um das zu tun, was Sie benötigen.
Ido
Weil es nicht flexibel genug ist (was ist, wenn Sie eines Tages einen Rahmen mit einer Breite von 0,001 möchten?) Und der Name der Eigenschaft CGRect.myZeronicht viel Aufschluss darüber gibt, was er tun kann.
Jonny
Sie können es nennen, almostZerowenn es das ist, was es nicht flexibel macht. Sie können einen Kommentar über dem hinzufügen static let ..., um ihn zu beschreiben (mit 3 / können Sie ihn über die Autocomplete-Oberfläche des xCode anzeigen).
Ido
5

Erweiterungsbasierte Lösung für Swift 4, getestet auf iOS 12

Ich habe festgestellt, dass beim Festlegen einer leeren Ansicht von height = 1auch das Trennzeichen der letzten sichtbaren Zelle height = 0entfernt wird. Beim Festlegen wird jedoch nur das Trennzeichen der leeren Zellen entfernt

extension UITableView {
    func removeSeparatorsOfEmptyCells() {
        tableFooterView = UIView(frame: .zero)
    }

    func removeSeparatorsOfEmptyCellsAndLastCell() {
        tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1)))
    }
}
fl034
quelle
1
Vielen Dank. Es stellt sich heraus, dass jede positive Höhe ungleich Null ausreicht. zB 0,1 Punkte hoch.
Womble
3

Meine kürzere Version:

self.tblView.tableFooterView = [UIView new];
Marco Mardegan
quelle
3

In Swift einfach:

tableView.tableFooterView = UIView()
DungeonDev
quelle
Verwenden Sie Swift 3?
DungeonDev
Das hat bei mir funktioniert. Hinweis Ich habe eine Unterklasse von aUITableViewController
Alex Chase
iOS 13.4.1 funktioniert nicht, aber `` `tableView.tableFooterView = UIView (Frame: CGRect (x: 0, y: 0, Breite: CGFloat.leastNonzeroMagnitude, Höhe: .leastNonzeroMagnitude))` ``
leo.tan
2

Hier ist das Mittel, das ich derzeit benutze. Es ist vielleicht nicht der beste Ansatz, aber es funktioniert.

Entfernen Sie SeparatorColor und setSeparatorStyle, um ein benutzerdefiniertes Trennzeichen zu erstellen

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setSeparatorColor:[UIColor clearColor]];
}

Fügen Sie jeder Zelle mit Tabellenansicht-Hintergrund ein benutzerdefiniertes Trennzeichen hinzu

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    ...

    UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
    separatorLineView.backgroundColor = self.tableView.backgroundColor;
    [cell.contentView addSubview:separatorLineView];

    return cell;
}
rtato
quelle
1
Dies funktioniert nicht mit Zellen mit benutzerdefinierter Höhe. An dem Punkt, an dem Sie die Höhe der Zelle abrufen, wurde die Zelle noch nicht vollständig angelegt. Außerdem sollten Sie keine fest codierten Werte wie 320 verwenden - wie sieht das auf einem iPhone 6 aus?
Zorayr
1

Für iOS 7 und höher

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL bIsLastRow = NO;

        //Add logic to check last row for your data source
        NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
        if([_arrDataSource lastObject] == dict)
        {
           bIsLastRow = YES;
        }

        //Set last row separate inset left value large, so it will go outside of view
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
        {
            [cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
        }
    }
Aditya Deshmane
quelle
1
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
Ohana
quelle
3
Hallo und willkommen bei stackoverflow, und danke für die Antwort. Während dieser Code möglicherweise die Frage beantwortet, können Sie eine Erklärung hinzufügen, was das Problem ist, das Sie gelöst haben, und wie Sie es gelöst haben? Dies wird zukünftigen Lesern helfen, Ihre Antwort besser zu verstehen und daraus zu lernen.
Plutian
1

Der folgende Code hilft mir, das Trennzeichen aus der letzten Zeile in einer UITableView zu entfernen.

Swift 3.0

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) {
        cell.separatorInset.right = cell.bounds.size.width
    }
}
user2991638
quelle
0

Suchen Sie den letzten Zellenindex im cellForRowDelegaten und geben Sie die Codezeile von unten ein:

cell.separatorInset = UIEdgeInsetsMake(
    0.f,
    40.0f,
    0.f,
    self.view.frame.size.width-40.0f
);
Suresh Kansujiya
quelle
0

Eine andere Option ist die Unterklasse UITableView:

@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
    if (_hideLastSeparator == hideLastSeparator) {
        return;
    }
    _hideLastSeparator = hideLastSeparator;
    if (_hideLastSeparator) {
        _hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
        _hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        _hideLastSeparatorView.backgroundColor = self.backgroundColor;
        [self addSubview:_hideLastSeparatorView];
        [self hideSeparator];
    }
    else {
        [_hideLastSeparatorView removeFromSuperview];
        _hideLastSeparatorView = nil;
    }
}
-(void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    if (_hideLastSeparator) {
        [self hideSeparator];
    }
}
-(void)hideSeparator {
    CGRect frame = _hideLastSeparatorView.frame;
    frame.origin.y = self.contentSize.height - frame.size.height;
    _hideLastSeparatorView.frame = frame;
}

Die .h sollte nur Eigenschaftsdeklarationen für hideLastSeparatorund enthalten hideLastSeparatorView.
Wenn Sie das Trennzeichen ausblenden möchten, verwenden Sie die neue Klasse und setzen Sie myTableView.hideLastSeparator = YES.
Dies funktioniert, indem das letzte Trennzeichen blockiert wird, indem eine neue Ansicht darüber hinzugefügt wird.

Dies ist meiner Meinung nach etwas einfacher zu verwenden (als ein benutzerdefiniertes Trennzeichen zu verwenden oder das letzte Trennzeichen-Set der letzten Zelle festzulegen) und vermeidet einige seltsame Animationen, die die Methode zum Festlegen einer tableFooterViewmanchmal verursacht (z. B. beim Einfügen / Löschen von Zeilen oder einer anderen Tabelle) Animationen).

alex-i
quelle
0

Swift 4.2

Fügen Sie in Ihrer UITableViewDataSource's tableView(_:cellForRowAt:)Implementierung Folgendes hinzu, um ein Trennzeichen zu erhalten, das in Ihrer letzten Zelle von links nach rechts verläuft :

if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
        cell.separatorInset = .zero
}

Wenn Sie kein Trennzeichen für eine bestimmte Zelle möchten, sollten Sie ein eigenes Trennzeichen zeichnen und festlegen tableView.separatorStyle = .none.

JanApotheker
quelle
0

Wenn Sie benutzerdefinierte Trennzeichen für Ihre UITableViewCellLösung verwenden, ist die beste Lösung:

  1. Implementieren Sie in Ihrer benutzerdefinierten Zellenfunktion, die sich versteckt separatorView
class YourCell: UITableViewCell {
    // Your implementation goes here...
    // Separator view in cell
    @IBOutlet private weak var separatorView: UIView!

    // This function hides the separator view
    func hideSeparator() {
        separatorView.isHidden = true
    }
}
  1. In tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)berechnen , wenn die Zelle die letzte und versteckt es den Separator
public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = cell as? YourCell else {
            return
    }
    // Here we're checking if your cell is the last one
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
        // if true -> then hide it
        cell.hideSeparator()
    }
}
Nazariy Vlizlo
quelle
-2

Wenn ich die Antwort von Tonny Xu erweitere, habe ich mehrere Abschnitte, und dies scheint zum Entfernen des letzten Zellentrenners zu funktionieren

if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1)
{
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
}

In der cellForRowAtIndexPathDatenquelle

Josh Valdivieso
quelle
1
Dies hängt von einigen versteckten Implementierungsdetails ab - Sie sollten dies eigentlich nicht tun. tableFooterViewexistiert für die gesamte Tabelle und nicht nur für die letzte Zelle. Insgesamt eine hackige Lösung, die möglicherweise nicht immer funktioniert.
Zorayr