it-swarm.com.de

UITableView: der richtige Weg, um ein Trennzeichen für die letzte Zelle anzuzeigen

Die Frage ist, wie Sie am besten ein Trennzeichen in der letzten Zelle einer Tabelle/eines Abschnitts anzeigen können. 

Grundsätzlich bin ich danach.

enter image description hereDies ist von der nativen Musik-App. Ich denke, dass es möglich sein sollte, nur mit UITableView zu erreichen, sie würden keine private API für Zellseparatoren verwenden, oder?

Ich weiß, dass Sie ohne eigentliche Trennzeichen davonkommen können, aber eine Pixelzeile am unteren Rand der Zelle hinzufügen. Aber ich bin kein Fan dieses Ansatzes, weil

  1. Wenn eine Zelle ausgewählt/hervorgehoben wird werden ihr Trennzeichen und das Trennzeichen der vorherigen Zelle automatisch ausgeblendet (siehe den zweiten Screenshot mit "Sie müssen verrückt sein"). Und das ist .__ etwas, was ich möchte, wenn UITableView verwendet wird, anstatt mich selbst zu verwenden, wenn ich eine Einpixel-Zeile verwende. (. Dies ist besonders praktisch, wenn Zellseparatoren nicht den ganzen Weg bis zum Rand der Tabellenansicht erstrecken (Trennzeichen und Hintergrund der ausgewählten Zelle sehen nicht schön aus).
  2. Ich möchte meine Zellen so flach wie möglich halten, um beim Scrollen zu arbeiten.

Es gibt auch etwas in UITableView, das mich denken lässt, dass es einen einfachen Weg gibt, das zu bekommen, was ich will:

In iOS 7 und höher erstrecken sich Zellseparatoren nicht bis auf Rand der Tabellenansicht. Diese Eigenschaft legt den Standardeinsatz für alle .__ fest. Zellen in der Tabelle, ähnlich wie in rowHeight die Standardhöhe für Zellen. Er wird auch zur Verwaltung der bei .__ gezeichneten "zusätzlichen" Trennzeichen verwendet. die Unterseite der einfachen Tabellen.

Weiß jemand, wie diese „zusätzlichen“ Trennzeichen verwendet werden sollen, die unten in einfachen Stiltabellen gezeichnet werden? Denn genau das brauche ich. Ich dachte, die Zuweisung von separatorInset zur UITableView, nicht UITableViewCell würde den Trick tun, aber das tut es nicht, der letzten Zelle fehlt immer noch das Trennzeichen.

Momentan sehe ich nur eine Option: eine benutzerdefinierte Abschnittsfußzeile, die das Trennzeichen für die letzte Zelle nachahmt. Und das ist nicht gut, vor allem, wenn Sie einen tatsächlichen Abschnittsfuß mit der tableView:titleForFooterInSection:-Methode haben möchten.

29
dariaa

Dies funktionierte einwandfrei für mich, um der letzten Zelle ein Trennzeichen hinzuzufügen. habe Spaß!

self.tableView.tableFooterView = [[UIView alloc] init];
16
Timo Cengiz

Wenn Sie Ihrer TableView headerView oder footerView hinzufügen, wird die letzte Trennlinie nicht mehr angezeigt. 

Im folgenden Beispiel können Sie eine Problemumgehung für die Anzeige des Trennzeichens in der letzten Zelle durchführen. Das einzige, was Sie noch implementieren müssen, ist, dieses Trennzeichen nach der Auswahl der Zelle verschwinden zu lassen. Das Verhalten ist also dasselbe wie in den übrigen Zellen.

Für Swift 4,0

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

    let result = UIView()

    // recreate insets from existing ones in the table view
    let insets = tableView.separatorInset
    let width = tableView.bounds.width - insets.left - insets.right
    let sepFrame = CGRect(x: insets.left, y: -0.5, width: width, height: 0.5)

    // create layer with separator, setting color
    let sep = CALayer()
    sep.frame = sepFrame
    sep.backgroundColor = tableView.separatorColor?.cgColor
    result.layer.addSublayer(sep)

    return result
}
8
lukszar

Ich habe gerade etwas gefunden, das für mich funktioniert. In wenigen Worten: geben Sie Ihrem UITableView einen tableFooterView und stellen Sie die Höhe des Frames auf 0 . Dadurch wird ein tatsächliches Trennzeichen mit den richtigen Einfügungen angezeigt.

Im Detail: Wenn Sie das Storyboard verwenden, ziehen Sie eine UIView an den unteren Rand Ihrer Tabellenansicht (in der Strukturansicht links), sodass sie auf derselben hierarchischen Ebene direkt unterhalb der Tabellenzellenzelle angezeigt wird. Dies erstellt eine tableFooterView. Natürlich kann dies auch programmgesteuert erfolgen.

Dann in der Implementierung Ihres UITableViewControllers:

UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];

Lassen Sie mich wissen, ob das für Sie funktioniert! Es kann auch für das erste Trennzeichen funktionieren, wenn Sie stattdessen ein tableHeaderView verwenden. Ich habe es jedoch nicht versucht.

7
SimonFrr

dies wird genau das tun, was Sie wollen. Auch wenn die Linie die gesamte Breite der Zelle einnimmt:

in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;
3
Ilario

Sie können so etwas tun, wenn Sie keine Abschnitte verwenden: 

- (void)viewDidLoad
{
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}

Wenn Sie Abschnitte verwenden, implementieren Sie die Fußzeile in jedem Abschnitt als Einpunktansicht in den Methoden

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}

Auf diese Weise können Sie ein Trennzeichen für Ihre letzte Zelle verwenden, bei dem es sich tatsächlich nicht um ein Trennzeichen handelt. Dies ist eine Fußzeile, mit der Sie damit spielen können und es als Trennzeichen erscheinen lassen

2
artud2000

Also hier eine super einfache Lösung in Swift 4 die funktioniert:

In override func viewDidLoad(){} habe ich einfach diese Codezeile implementiert:

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

Somit wird sichergestellt, dass nur die letzte Zelle den Trenneinsatz erhält.

Das hat perfekt für mich funktioniert, hoffe es auch für Sie!

2
Nii Mantse

Ich hatte ein ähnliches Problem und fand eine Problemumgehung. Apple blendet das letzte Trennzeichen für die uitableviewcell aus und zeigt es an, wenn Sie die Zelle auswählen oder wenn Sie anrufen, ob Sie die Zelle auswählen und die Auswahl aufheben möchten.

Also habe ich gelehrt, dass das Beste in - (void)layoutSubviews ist. Die Trennzeichenansicht heißt _separatorView und ist eine private Eigenschaft. Wenn Sie die ausgewählten/hervorgehobenen Zustände der Zelle verwenden, können Sie etwa Folgendes finden:

- (void)layoutSubviews
{
    // Call super so the OS can do it's layout first
    [super layoutSubviews];

    // Get the separator view
    UIView *separatorView = [self valueForKey:@"_separatorView"];
    // Make the custom inset
    CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
    newFrame = CGRectInset(newFrame, 15.0, 0.0);
    [separatorView setFrame:newFrame];

    // Show or hide the bar based on cell state        
    if (!self.selected) {
        separatorView.hidden = NO;
    }
    if (self.isHighlighted) {
        separatorView.hidden = YES;
    }
}

Etwas wie das.

2
Cyupa

Wenn Sie unter iOS 8 ein einfaches UITableView-Format haben und eine Fußzeile hinzufügen, ist das letzte Trennzeichen nicht mehr vorhanden. Sie können es jedoch leicht wiederherstellen, indem Sie der Fußzeile eine benutzerdefinierte Trennansicht hinzufügen.

Dieses Beispiel entspricht genau dem Trennzeichenstil des Today Widget

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        //create footer view
        let result = UIView()
        result.frame.size.height = tableView.rowHeight

        //recreate last cell separator, which gets hidden by footer
        let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
        let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
        vibrancyEffectView.frame = sepFrame
        vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
        result.addSubview(vibrancyEffectView)
        return result
}
1
Vilém Kurz

Wenn Sie eine leere Fußzeile hinzufügen, entfernt die Tabellenansicht alle verbleibenden Zeilentrennzeichen (für nicht vorhandene Zellen), enthält jedoch weiterhin das Trennzeichen für die letzte Zelle:

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

Swift 3

Ich habe dieses alte Problem gefunden, also habe ich es auch in Swift versucht:

    tableView.tableFooterView = UIView()
    tableView.tableFooterView?.height = 0 // Maybe not necessary

Aber es führt zu einem anderen Problem (in meinem Fall). Also habe ich es anders gelöst. Ich habe am Ende dieses Abschnitts eine zusätzliche Zelle hinzugefügt, leer und mit einer Höhe von Null:

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return previousNumberOfRows + 1
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      return indexPath.row == previousNumberOfRows ? 0 : previousCellHeight
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      if indexPath.row == items.count {
        return UITableViewCell()
    } else {
       previousCellInitialization()
    }

Dies ist eine weniger prägnante Lösung, funktioniert jedoch in mehreren Fällen, wenn Sie mehrere Abschnitte haben, vorhandene Fußzeilenansichten ...

0
Cocatrix

Funktioniert in iOS 7.x und 8.x (in cellForRowAtIndexPath):

(PS ersetzt "max-Elemente Ihrer Datenquelle" mit der Anzahl der Array-Datenquellen)

 if (row == <max elements of your datasource>-1) {
     UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
     separatorLineView.tag = 666;
     separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
     UIView *separator = [cell.contentView viewWithTag:666];
     // case of orientation changed..
     if (separator.frame.size.width != cell.contentView.frame.size.width) {
        [[cell.contentView viewWithTag:666] removeFromSuperview];
        separator = nil;
     }
     if (separator==nil) [cell.contentView addSubview:separatorLineView];
 }
0

Dies ist definitiv eine Hilfe. Arbeiten. aber Trennzeichen "none" aus dem Attribut-Inspektor . Schreiben Sie den folgenden Code in die cellForRowAtIndexPath -Methode

if(indexPath.row==arrData.count-1){
 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,           
 cell.contentView.frame.size.height - 1.0,      
 cell.contentView.frame.size.width, 1)];

    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];
}
0

Der folgende Code hat für mich funktioniert:

UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.Origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;

Ich hoffe es funktioniert auch für dich.

0
Ashik