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:
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 einfaches UIView
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];
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))
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
Datenquelle
1.0f
als Fußzeilenhöhe im -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
Delegaten übergeben werden. Jetzt funktioniert es wie ein Zauber. Upvoted
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);
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 Querformat
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.
.zero
linke Trennzeichen am Ende der Tabelle.
CGRect
Erweiterung, die du hinzugefügt hast, eine großartige Übung ist. Wenn Sie diese umständlichen 0
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ügen static 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 Zelle height = 0
entfernt 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)))
}
}
Meine kürzere Version:
self.tblView.tableFooterView = [UIView new];
In Swift einfach:
tableView.tableFooterView = UIView()
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;
}
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)];
}
}
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
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
}
}
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
);
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 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 tableFooterView
manchmal verursacht (z. B. beim Einfügen / Löschen von Zeilen oder einer anderen Tabelle) Animationen).
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
.
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()
}
}
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
Datenquelle
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.