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:
iphone
objective-c
ios
xcode
uitableview
Arnaud
quelle
quelle
Antworten:
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
tableView
Standardtrennlinie ausblenden und Ihre benutzerdefinierte Linie oben in jede Zelle einfügen. Der einfachste Weg, ein benutzerdefiniertes Trennzeichen hinzuzufügen, besteht darin, ein einfachesUIView
Trennzeichen 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];
quelle
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))
quelle
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 derCellForRowAtIndexPath
Datenquelle1.0f
als Fußzeilenhöhe im-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
Delegaten übergeben werden. Jetzt funktioniert es wie ein Zauber. UpvotedIn iOS 7 gibt es eine einfachere Lösung. Angenommen, Zelle ist Ihre letzte Zelle:
cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
quelle
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.bounds
da manchmal der falsche Wert gemeldet wird, je nachdem, wann Sie ihn aufrufen. Siehe Melden falscher Grenzen im Querformatquelle
cell!.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(self.tableView.bounds)-self.view.layoutMargins.left)
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.quelle
.zero
linke Trennzeichen am Ende der Tabelle.CGRect
Erweiterung, die du hinzugefügt hast, eine großartige Übung ist. Wenn Sie diese umständlichen0
im Beispielcode nicht mögen , können Sie so etwas schreiben:var frame = CGRect.zero \n frame.size.height = 0.001
.zero
, aber die tatsächliche Null (0,001) verwenden, um das zu tun, was Sie benötigen.CGRect.myZero
nicht viel Aufschluss darüber gibt, was er tun kann.almostZero
wenn es das ist, was es nicht flexibel macht. Sie können einen Kommentar über dem hinzufügenstatic let ...
, um ihn zu beschreiben (mit 3 / können Sie ihn über die Autocomplete-Oberfläche des xCode anzeigen).Erweiterungsbasierte Lösung für Swift 4, getestet auf iOS 12
Ich habe festgestellt, dass beim Festlegen einer leeren Ansicht von
height = 1
auch das Trennzeichen der letzten sichtbaren Zelleheight = 0
entfernt wird. Beim Festlegen wird jedoch nur das Trennzeichen der leeren Zellen entferntextension UITableView { func removeSeparatorsOfEmptyCells() { tableFooterView = UIView(frame: .zero) } func removeSeparatorsOfEmptyCellsAndLastCell() { tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1))) } }
quelle
Meine kürzere Version:
self.tblView.tableFooterView = [UIView new];
quelle
In Swift einfach:
tableView.tableFooterView = UIView()
quelle
UITableViewController
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; }
quelle
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)]; } }
quelle
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
quelle
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 } }
quelle
Suchen Sie den letzten Zellenindex im
cellForRow
Delegaten und geben Sie die Codezeile von unten ein:cell.separatorInset = UIEdgeInsetsMake( 0.f, 40.0f, 0.f, self.view.frame.size.width-40.0f );
quelle
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
hideLastSeparator
und enthaltenhideLastSeparatorView
.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
tableFooterView
manchmal verursacht (z. B. beim Einfügen / Löschen von Zeilen oder einer anderen Tabelle) Animationen).quelle
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
.quelle
Wenn Sie benutzerdefinierte Trennzeichen für Ihre
UITableViewCell
Lösung verwenden, ist die beste Lösung: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 } }
tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
berechnen , wenn die Zelle die letzte und versteckt es den Separatorpublic 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() } }
quelle
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
cellForRowAtIndexPath
Datenquellequelle
tableFooterView
existiert für die gesamte Tabelle und nicht nur für die letzte Zelle. Insgesamt eine hackige Lösung, die möglicherweise nicht immer funktioniert.