Trennlinie auf einer UITableViewCell ausblenden

250

Ich passe a an UITableView. Ich möchte die Trennlinie in der letzten Zelle ausblenden ... kann ich das tun?

Ich weiß, dass ich das kann, tableView.separatorStyle = UITableViewCellStyle.Noneaber das würde alle Zellen der tableView betreffen. Ich möchte, dass es nur meine letzte Zelle betrifft.

Safari
quelle
Deine Frage hat meine beantwortet. tableView.separatorStyle = UITableViewCellStyle.None war die Zeile, die ich brauchte
Malachi Holden

Antworten:

371

in viewDidLoad, fügen Sie diese Zeile:

self.tableView.separatorColor = [UIColor clearColor];

und in cellForRowAtIndexPath:

für iOS niedrigere Versionen

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

für iOS 7 obere Versionen (einschließlich iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Hiren
quelle
4
Dies funktioniert unter iOS7 und iOS8. Es drückt den Separator effektiv auf Null. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris
9
Eine Erinnerung: Wenn Ihr iDevice ein iPad ist und die Zelle AutoLayout verwendet, entspricht der von "cell.bounds.size.width" zurückgegebene Wert möglicherweise nicht der tatsächlichen Zellenbreite. Daher verwende ich immer "tableView.frame.size.width" anstelle von "cell.bounds.size.width".
Veight Zhou
5
Bitte beachten Sie: Sie sollten [cell.contentView addSubview:line]anstelle von[cell addSubview:line]
Anastasia
6
change cell.separatorInset linker Einschub ändert auch den linken Einschub des Zelleninhalts. Nicht nur die Trennlinie. Aus Apple Doc: "Mit dieser Eigenschaft können Sie Platz zwischen dem Inhalt der aktuellen Zelle und dem linken und rechten Rand der Tabelle hinzufügen. Positive Einfügungswerte verschieben den Zelleninhalt und das Zellentrennzeichen nach innen und von den Tabellenkanten weg."
Zgjie
9
Schlechte Idee. Sie sollten einer Zelle in niemals Unteransichten hinzufügen cellForRowAtIndexPath. Denken Sie daran, dass Zellen wiederverwendet werden. Jedes Mal, wenn diese Zelle wiederverwendet wird, fügen Sie eine weitere Trennlinienansicht hinzu. Bei großen Listen kann dies die Bildlaufleistung beeinträchtigen. Und es ist einfach nicht der richtige Weg, es zu tun.
Dave Batton
247

Sie können den folgenden Code verwenden:

Swift:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

oder :

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

für Standardmarge:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

um das Trennzeichen von Ende zu Ende anzuzeigen

cell.separatorInset = .zero

Ziel c:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Avinash
quelle
Funktioniert nicht für eine Gruppe UITableView, während die akzeptierte Antwort dies tut.
Aleks N.
3
Dies funktioniert nicht für iOS9, self.tableView.separatorColor = [UIColor clearColor];behoben.
Ben
1
Es ist ein kompletter Hack, aber was in iOS 9 funktioniert, ist: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer
So funktioniert es in iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);Wenn ich den Wert cell.layoutMargins.left nicht subtrahiere, wird die Trennlinie vom linken Rand zum linken Rand gezogen (falls vorhanden).
Alexandre OS
3
Dies drückt jeden textLabelOff-Screen.
Aehlke
99

Um Hirens Antwort zu verfolgen .

in ViewDidLoad und der folgenden Zeile:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Wenn Sie XIBs oder Storyboards verwenden, ändern Sie " Trennzeichen " in " Keine ":

Interface Builder

Und in CellForRowAtIndexPath fügen Sie Folgendes hinzu:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

Hier ist ein Beispiel für das Ergebnis, bei dem ich eine Tabellenansicht mit dynamischen Zellen anzeige (aber nur eine einzige mit Inhalt). Das Ergebnis ist, dass nur dieser ein Trennzeichen hat und nicht alle "Dummy" -Tabellenansichten automatisch hinzugefügt werden, um den Bildschirm auszufüllen.

Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft.

BEARBEITEN: Für diejenigen, die die Kommentare nicht immer lesen, gibt es tatsächlich einen besseren Weg, dies mit ein paar Codezeilen zu tun:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
Benjamin
quelle
Ich denke, um die Trennlinie zu verbergen, ist dies der richtige Ansatz. self.tableView.separatorStyle = .none
arango_86
52

Wenn Sie das Trennzeichen nicht selbst zeichnen möchten, verwenden Sie Folgendes:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Diese API ist jedoch nur ab iOS 7 verfügbar.

Kemenaran
quelle
8
separatorInsetscheint sowohl den Zellinhalt als auch das Trennzeichen cell.IndentationWidth = -10000;
einzufügen
23
Eine bessere Methode besteht darin separatorInset, für oben, links und unten auf 0 und für rechts auf cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); die Zellenbreite zu setzen : Dadurch müssen keine anderen Zelleigenschaften angepasst werden.
Bryguy1300
Wenn Sie die Breite der Zellengrenzen für den Einschub verwenden, müssen Sie möglicherweise neu berechnen, wenn sich die Schnittstelle dreht.
AndrewR
Beachten Sie, dass, wenn die Zelle, für die Sie dies tun, wieder zum Zeichnen einer anderen Zelle verwendet wird, für die Sie das Trennzeichen nicht ausblenden wollten, das Trennzeichen ebenfalls entfernt wird.
Michael Peterson
1
UIEdgeInsetsMake (0, 10000, 0, 0); gearbeitet -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); nicht. Ich schätze, das liegt daran, dass ich die böse Angewohnheit habe, 3,5-Zoll-Vcs in Xibs und Styoryboards zu behalten, die durch Artefakte auf 4-Zoll-Geräten verursacht werden. 375-320px Abschnitt = 55px bleibt. (in Yoda Stimme) und sehr hässlich ist es!
Anton Tropashko
29

Meine Entwicklungsumgebung ist

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

Die obigen Antworten funktionieren bei mir nicht vollständig

Nach dem Versuch ist meine endlich funktionierende Lösung:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

und der Effekt ist: Geben Sie hier die Bildbeschreibung ein

Crifan
quelle
20

Setze separatorInset.right = .greatestFiniteMagnitudeauf dein Handy.

Matthew Korporaal
quelle
diese beim Aufruf awakeFromNibkann der gesamte Bildschirm blinken aufapplicationDidBecomeActive
Brotkasten
Dies funktioniert mit iOS 12.2 auf dem Gerät aus der programmgesteuerten UITableViewCell-Erstellung. Nett.
Womble
Das Einstellen des richtigen Trennzeichens hat bei mir funktioniert, wenn ich es in cellForRowAt einstelle. Die besten Lösungen. Es funktioniert von iOS 10 bis 13 für mich. Getestet auf iOS 10, 12 und 13. Wenn der linke Rand eingestellt ist, funktioniert es nicht für iOS 10.
Ariel Bogdziewicz
18

In Swift 3, Swift 4 und Swift 5 können Sie eine Erweiterung für UITableViewCell wie folgt schreiben:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

Dann können Sie dies wie folgt verwenden (wenn cell Ihre Zelleninstanz ist):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

Es ist wirklich besser, die Breite der Tabellenansichtszelle als linken Einschub zuzuweisen, als ihr eine Zufallszahl zuzuweisen. Denn in einigen Bildschirmabmessungen sind Ihre Trennzeichen möglicherweise nicht jetzt, aber in Zukunft noch sichtbar, da diese Zufallszahl möglicherweise nicht ausreicht. Außerdem können Sie im iPad im Querformat nicht garantieren, dass Ihre Trennzeichen immer unsichtbar sind.

Okhan Okbay
quelle
Dies funktioniert nicht für UITableView im gruppierten Stil. Haben Sie eine Lösung für einen gruppierten Fall?
zslavman vor
8

Bessere Lösung für iOS 7 & 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

Wenn Ihre App drehbar ist, verwenden Sie 3000.0f für die Konstante des linken Einschubs oder berechnen Sie sie im laufenden Betrieb. Wenn Sie versuchen, den rechten Einschub festzulegen, sehen Sie unter iOS 8 einen sichtbaren Teil des Trennzeichens auf der linken Seite der Zelle.

Sound Blaster
quelle
1
Warum eine Zufallszahl verwenden, wenn Sie so etwas tun könnten: MAX ([[UIScreen mainScreen] Grenzen] .size.width, [[UIScreen mainScreen] Grenzen] .size.height); um sicherzustellen, dass es immer weg ist
Daniel Galasko
7

In iOS 7 sieht das gruppierte Zellentrennzeichen im UITableView-Stil etwas anders aus. Es sieht ein bisschen so aus:

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht, Kemenarans Antwort darauf zu geben:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Das scheint jedoch bei mir nicht zu funktionieren. Ich bin mir nicht sicher warum. Also entschied ich mich, Hirens Antwort zu verwenden , aber UIViewanstelle von UIImageViewund zeichnete die Linie im iOS 7-Stil:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

Wenn Sie dies verwenden, stellen Sie sicher, dass Sie in der zweiten if-Anweisung die richtige Höhe der Tabellenansicht eingeben. Ich hoffe das ist nützlich für jemanden.

Enrico Susatyo
quelle
7

Überschreiben Sie in Ihrer UITableViewCell-Unterklasse layoutSubviews und blenden Sie die _UITableViewCellSeparatorView aus. Funktioniert unter iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
Tualatrix Chou
quelle
Keine der oben genannten Lösungen hat funktioniert. Dies funktioniert auf iOS 12
Abdul Waheed
Dies wird möglicherweise vom App Store für den Zugriff auf private APIs abgelehnt.
Elliot Fiske
5

Ich glaube nicht, dass dieser Ansatz unter keinen Umständen mit dynamischen Zellen funktioniert ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

Es spielt keine Rolle, in welcher Tableview-Methode Sie dies für dynamische Zellen tun. In der Zelle, in der Sie die Inset-Eigenschaft geändert haben, wird die Inset-Eigenschaft jetzt jedes Mal festgelegt, wenn sie aus der Warteschlange entfernt wird, was zu einem Amoklauf fehlender Zeilentrennzeichen führt ändere es selbst.

So etwas hat bei mir funktioniert:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

Auf diese Weise aktualisieren Sie Ihren Datenstrukturstatus bei jeder Last

Greg Price
quelle
4

In Swift mit iOS 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

Hinweis: Dieses obige Snippet funktioniert in UITableView mit dynamischen Zellen. Das einzige Problem, auf das Sie stoßen können, besteht darin, dass Sie statische Zellen mit Kategorien, einem anderen Trennertyp als keinem und einem gruppierten Stil für die Tabellenansicht verwenden. In diesem speziellen Fall wird die letzte Zelle jeder Kategorie nicht ausgeblendet. Um dies zu überwinden, bestand die Lösung darin, das Zellentrennzeichen (über IB) auf "Keine" zu setzen und dann manuell (durch Code) Ihre Zeilenansicht zu jeder Zelle zu erstellen und hinzuzufügen. Ein Beispiel finden Sie im folgenden Snippet:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}
König-Zauberer
quelle
In meinem Projekt funktioniert dies für statische Zellen, aber nicht für dynamische. Im letzteren Fall wird der Inhalt der letzten Zelle nach rechts verschoben (genau wie die Trennlinie). Irgendwelche Ideen, warum das passieren könnte?
Bastian
Der erste Ausschnitt der obigen Antwort funktioniert in UITableView mit dynamischen Zellen. Das einzige Problem, auf das Sie stoßen können, besteht darin, statische Zellen mit Kategorien, einem anderen Trennertyp als keinem und einem gruppierten Stil für die Tabellenansicht zu verwenden. In diesem speziellen Fall wird die letzte Zelle jeder Kategorie nicht ausgeblendet. Um dies zu überwinden, bestand die Lösung darin, das Zellentrennzeichen (über IB) auf "Keine" zu setzen und dann manuell (über Code) Ihre Zeilenansicht zu jeder Zelle zu erstellen und hinzuzufügen. Ein Beispiel finden Sie im zweiten Ausschnitt der obigen Antwort.
König-Zauberer
es verschiebt Text (Titel), also nutzlos!
Benutzer155
4

Verwenden Sie diese Unterklasse, Set separatorInsetfunktioniert nicht für iOS 9.2.1, Inhalte würden komprimiert.

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9

liruqi
quelle
4

Das viel einfachere und logischere ist, dies zu tun:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

In den meisten Fällen möchten Sie nicht nur das letzte tableCiewCell-Trennzeichen sehen. Bei diesem Ansatz wird nur das letzte tableViewCell-Trennzeichen entfernt, und Sie müssen nicht an Autolayout-Probleme (z. B. rotierende Geräte) oder Hardcode-Werte denken, um Trennzeicheneinfügungen einzurichten.

rostislawk
quelle
1
Willkommen bei Stack Overflow! Eine bessere Antwort für zukünftige Leser würde erklären, warum dies einfacher und logischer ist.
CGritton
eine schöne lösung!
Geek1706
3

In willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
Kimate Richards
quelle
3

Mit Swift 3 und der schnellsten Hacking-Methode können Sie Code mithilfe von Erweiterungen verbessern :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

Wenn Sie dann die Zelle konfigurieren:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}
Luca Davanzo
quelle
2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
Gank
quelle
2

Der beste Weg , dies zu erreichen , ist Standard Zeilenseparatoren auszuschalten, Unterklasse UITableViewCellund eine eigene Linie Separator als Subview des Add contentView- siehe unten eine benutzerdefinierte Zelle , die verwendet wird , ein Objekt vom Typ darzustellen , SNStockdie zwei String - Eigenschaften hat, tickerund name:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

Um das Standard-Zeilentrennzeichen zu deaktivieren, verwenden Sie , tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Die Verbraucherseite ist relativ einfach, siehe Beispiel unten:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}
Zorayr
quelle
2

Für Swift 2:

Fügen Sie die folgende Zeile hinzu viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
Sebastian
quelle
2

Wenn die akzeptierte Antwort nicht funktioniert, können Sie Folgendes versuchen:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

Es ist toll ;)

debiasej
quelle
1

Versuchen Sie den folgenden Code, um Ihr Problem zu lösen

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

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}
Nakkeeran
quelle
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}
Adobels
quelle
1

Sie müssen eine benutzerdefinierte Zelle nehmen und Beschriftung hinzufügen und Einschränkungen festlegen, z. B. Beschriftung sollte den gesamten Zellenbereich abdecken. und schreiben Sie die folgende Zeile in den Konstruktor.

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

Stellen Sie außerdem den UITableView-Layoutrand wie folgt ein

tblSignup.layoutMargins = UIEdgeInsetsZero;
Coder_A_D
quelle
1

Ich konnte das Trennzeichen in einer bestimmten Zelle nur mit der folgenden Problemumgehung ausblenden

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
Mahmoud Adam
quelle
1

Für iOS7 und höher besteht die sauberere Methode darin, INFINITY anstelle eines fest codierten Werts zu verwenden. Sie müssen sich keine Gedanken über die Aktualisierung der Zelle machen, wenn sich der Bildschirm dreht.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Xchord
quelle
3
Seien Sie gewarnt: Die Verwendung von INFINITY verursacht eine Laufzeitausnahme unter iOS9
AndrewR
1

Wie (viele) andere bereits betont haben, können Sie alle UITableViewCell-Trennzeichen einfach ausblenden, indem Sie sie einfach für die gesamte UITableView selbst deaktivieren. zB in Ihrem UITableViewController

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

Leider ist es eine echte PITA, die pro Zelle durchgeführt werden muss, was Sie wirklich fragen.

Persönlich habe ich zahlreiche Permutationen versucht, das zu ändern cell.separatorInset.left, wie (viele) andere vorgeschlagen haben, aber das Problem ist, Apple zu zitieren (Hervorhebung hinzugefügt):

" ... Mit dieser Eigenschaft können Sie Platz zwischen dem Inhalt der aktuellen Zelle und dem linken und rechten Rand der Tabelle hinzufügen . Positive Einfügungswerte verschieben den Zelleninhalt und das Zellentrennzeichen nach innen und von den Tabellenkanten weg ... "

Wenn Sie also versuchen, das Trennzeichen zu "verbergen", indem Sie es außerhalb des Bildschirms nach rechts schieben, können Sie am Ende auch die Inhaltsansicht Ihrer Zelle einrücken. Wie von Crifan vorgeschlagen, können Sie dann versuchen, diesen bösen Nebeneffekt zu kompensieren, indem Sie alles einstellen cell.indentationWidthund cell.indentationLevelentsprechend zurückschieben, aber ich habe festgestellt, dass dies auch unzuverlässig ist (Inhalte werden immer noch eingerückt ...).

Der zuverlässigste Weg, den ich gefunden habe, besteht darin, layoutSubviewseine einfache UITableViewCell-Unterklasse zu überschreiben und den rechten Einschub so einzustellen , dass er auf den linken Einschub trifft, sodass das Trennzeichen eine Breite von 0 hat und somit unsichtbar ist [dies muss in layoutSubviews automatisch erfolgen Griffdrehungen]. Ich füge meiner Unterklasse auch eine praktische Methode hinzu, um dies zu aktivieren.

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

Vorsichtsmaßnahme: Es gibt keine zuverlässige Möglichkeit, den ursprünglichen rechten Einschub wiederherzustellen. Daher können Sie das Trennzeichen nicht "ausblenden", weshalb ich eine irreversible hideSeparatorMethode verwende (im Gegensatz zum Freilegen von TrennzeichenIsHidden). Beachten Sie, dass das separatorInset über wiederverwendete Zellen hinweg bestehen bleibt. Da Sie das Ausblenden nicht aufheben können, müssen Sie diese versteckten Trennzeichenzellen in ihrem eigenen reuseIdentifier isoliert halten.

Tiritea
quelle
1

Meine Anforderung war, das Trennzeichen zwischen der 4. und 5. Zelle zu verstecken. Ich habe es erreicht durch

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}
SMS
quelle
1

Schnell:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

Ziel c:

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

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}
RyuX51
quelle
1

Innerhalb der Tabellenansichtszellenklasse. Setzen Sie diese Codezeile

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
M. Nadeeshan
quelle
Berücksichtigt keine Änderungen des Geräte- / Szenenlayouts.
Womble
0

Unter iOS9 hatte ich das Problem, dass das Ändern der Trennzeicheneinfügungen auch die Positionierung des Text- und Detaillabels beeinflusst.

Ich habe es damit gelöst

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Saren Inden
quelle
Funktioniert nicht mit der UITableViewCell-Klasse - TextLabel und DetailedTextLabel entfernen sich von der Zelle.
Nik Kov