it-swarm.com.de

Separatorzeile auf einer UITableViewCell ausblenden

Ich passe eine UITableView an. Ich möchte die Trennlinie in der last Zelle verbergen ... kann ich das tun?

Ich weiß, dass ich tableView.separatorStyle = UITableViewCellStyle.None tun kann, aber das würde all die Zellen der tableView beeinflussen. Ich möchte, dass es nur meine letzte Zelle betrifft.

204
Safari

fügen Sie in viewDidLoad diese Zeile hinzu:

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);
}
326
Hiren

Sie können den folgenden Code verwenden:

Schnell:

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 Standard Margin: 

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

trennzeichen Ende bis Ende anzeigen 

cell.separatorInset = .zero

Ziel c:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
209
Avinash

Folgen Sie der Antwort von Hiren.

in ViewDidLoad und folgende Zeile:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Wenn Sie XIBs oder Storyboards verwenden, ändern Sie " separator " in " none ":

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 (aber nur eine einzige mit Inhalt) zeige. Das Ergebnis ist, dass nur derjenige ein Trennzeichen hat und nicht alle "Dummy" -Tabellen automatisch hinzugefügt werden, um den Bildschirm auszufüllen.

enter image description here

Hoffe das hilft.

EDIT: Für diejenigen, die die Kommentare nicht immer lesen, gibt es eine bessere Möglichkeit, dies mit ein paar Zeilen Code zu tun: 

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
84
Benjamin

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.

50
Kemenaran

meine entwicklungsumgebung ist

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

antworten oben funktionieren für mich nicht voll

nach dem Versuch ist meine endgültig 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:  enter image description here

29
crifan

Bessere Lösung für iOS 7 und 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 linke Einfügungskonstante oder berechnen Sie sie im laufenden Betrieb. Wenn Sie versuchen, die rechte Einfügung festzulegen, haben Sie auf iOS 8 einen Teil des Trennzeichens auf der linken Seite der Zelle sichtbar.

8
Sound Blaster

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

extension UITableViewCell {

  func hideSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: self.bounds.size.width, bottom: 0, right: 0)
  }

  func showSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  }
}

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

cell.hideSeparator()
cell.showSeparator()

Es ist wirklich besser, die Breite der Tabellenzellenzelle als linken Einzug zuzuweisen, statt einer Zufallszahl. In einigen Bildschirmabmessungen sind die Trennzeichen in Zukunft möglicherweise noch nicht sichtbar, da die Zufallszahl möglicherweise nicht ausreicht. Beim iPad im Querformatmodus können Sie auch nicht garantieren, dass Ihre Trennzeichen immer unsichtbar sind.

8

In iOS 7 sieht das in UITableView gruppierte Zelltrennzeichen etwas anders aus. Es sieht ein bisschen so aus:

enter image description here

Ich habe versucht, Kemenarans Antwort zu tun:

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

Das scheint aber bei mir nicht zu funktionieren. Ich bin mir nicht sicher warum. Also entschied ich mich für Hirens answer , aber UIView anstelle von UIImageView und zeichnet 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 die richtige Höhe der Tabellensicht in die zweite if-Anweisung einfügen. Ich hoffe das ist nützlich für jemanden.

7
Enrico Susatyo

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

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
6
Tualatrix Chou

Verwenden Sie diese Unterklasse, und setzen Sie separatorInset für iOS 9.2.1 nicht. Der Inhalt würde quetschen. 

@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

4
liruqi

Ich glaube nicht, dass dieser Ansatz unter allen Umständen mit dynamischen Zellen funktionieren wird ...

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 für dynamische Zellen die Zelle, für die Sie die Einfügungseigenschaft geändert haben, immer bei jeder Dequeu-Einstellung für die Einfügungseigenschaft festgelegt hat, was zu einem Ansturm fehlender Trennzeichen führt ändere es selbst.

So etwas funktionierte für mich:

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 den Status Ihrer Datenstruktur bei jeder Last

4
Greg Price

Das ist viel einfacher und logischer:

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

In den meisten Fällen möchten Sie nicht nur den letzten tableCiewCell-Separator sehen. Bei diesem Ansatz wird nur das letzte separater tableViewCell-Trennzeichen entfernt, und Sie müssen nicht über Probleme mit dem automatischen Layout (d. H. Rotierende Geräte) oder Hardcodewerte nachdenken, um Trennzeichen-Insets einzurichten.

4
rostislawk

In Swift Verwenden von 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 Snippet oben funktioniert mit dynamischen Zellen in UITableView. Das einzige Problem, auf das Sie stoßen können, ist, wenn Sie statische Zellen mit Kategorien verwenden, einen Trenner-Typ, der sich von none unterscheidet, und einen gruppierten Stil für die Tabellenansicht. In diesem speziellen Fall wird die letzte Zelle jeder Kategorie nicht ausgeblendet. Um dies zu überwinden, bestand die Lösung, die ich fand, darin, den Zellseparator (über IB) auf none zu setzen und dann die Linienansicht manuell zu erstellen und über jede Zeile in die Zelle einzufügen. Ein Beispiel finden Sie in dem 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)
    }
}
4
King-Wizard

Mit Swift 3 und der schnellsten Hacking-Methode können Sie Code mit extensions 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)
            }
        }
    }

}

Dann, wenn Sie 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
    }
}
3
Luca Davanzo

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

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

Es ist toll ;)

2
debiasej

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;
}
2
RyuX51

In willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
2
Kimate Richards
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
2
Gank

Für Swift 2:

füge folgende Zeile zu viewDidLoad() hinzu:

tableView.separatorColor = UIColor.clearColor()
1
Sebastian
- (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);
       }
}
1
Adobels

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];
        }
    }
}
1
Mahmoud Adam
cell.separatorInset = UIEdgeInsetsMake(0.0, cell.bounds.size.width, 0.0, -cell.bounds.size.width)

funktioniert gut in iOS 10.2

 enter image description here

1
katwal-Dipak

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

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

Legen Sie auch den UITableView Layout-Rand wie folgt fest

tblSignup.layoutMargins = UIEdgeInsetsZero;
1
Coder_A_D

Probieren Sie den folgenden Code aus, um das Problem möglicherweise 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;
}
1
Nakkeeran

Ich wollte das Trennzeichen zwischen der 4. und 5. Zelle verstecken. Ich habe es durch erreicht

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

Dies erreichen Sie am besten durch Deaktivieren der Standardzeilentrennzeichen, der Unterklasse UITableViewCell und Hinzufügen eines benutzerdefinierten Linientrennzeichens als Unteransicht der contentView - siehe unten eine benutzerdefinierte Zelle, in der ein Objekt vom Typ SNStock mit zwei Zeichenfolgeeigenschaften angezeigt wird ticker und 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 Standardseiltrennzeichen 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!
}
1
Zorayr

Für iOS7 und höher ist die sauberere Methode die Verwendung von INFINITY anstelle von fest codierten Werten. Sie müssen sich nicht um die Aktualisierung der Zelle kümmern, wenn sich der Bildschirm dreht.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
1
Xchord

Wie (viele) andere darauf hingewiesen haben, können Sie die UITableViewCell-Separatoren all ganz einfach ausblenden, indem Sie sie für die gesamte UITableView selbst deaktivieren. zB in Ihrem UITableViewController

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

Leider ist es eine echte PITA auf per-cell -Basis, was Sie wirklich fragen.

Ich persönlich habe bereits zahlreiche Permutationen ausprobiert, um den cell.separatorInset.left zu ändern, wie (viele) andere vorgeschlagen haben, aber das Problem ist, Apple zu zitieren (Hervorhebung hinzugefügt):

"... Sie können diese Eigenschaft verwenden, um Leerzeichen zwischen der aktuellen Zelle Inhalt und dem linken und rechten Rand der Tabelle hinzuzufügen. Positive Einfügewerte verschieben den Zellinhalt und das Zellseparator nach innen und weg von den Tischkanten ... "

Wenn Sie also versuchen, das Trennzeichen durch Verschieben des Trennzeichens nach rechts "auszublenden", können Sie am Ende auch die Inhaltsansicht Ihrer Zelle einrücken. Wie von crifan vorgeschlagen, können Sie dann versuchen, diesen unangenehmen Nebeneffekt zu kompensieren, indem Sie cell.indentationWidth und cell.indentationLevel entsprechend einstellen, um alles zurück zu verschieben. Ich habe jedoch festgestellt, dass dies ebenfalls unzuverlässig ist (der Inhalt wird immer noch eingerückt ...).

Die zuverlässigste Methode, die ich gefunden habe, ist, layoutSubviews in einer einfachen UITableViewCell-Unterklasse zu überschreiben und den right -Einzug so zu setzen, dass er auf den linken Einschub trifft, sodass das Trennzeichen 0 Breite hat und daher unsichtbar ist gemacht in layoutSubviews zur automatischen Bearbeitung von Rotationen]. Ich füge meiner Unterklasse auch eine bequeme 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

Vorbehalt: Es gibt keine zuverlässige Methode zum Wiederherstellen der rechten Einfügung von original. Sie können also das Trennzeichen nicht "ausblenden". Daher verwende ich eine irreversible hideSeparator-Methode (im Vergleich zu separatorIsHidden). Beachten Sie, dass separatorInset über wiederverwendete Zellen bestehen bleibt. Sie können diese ausgeblendeten Separator-Zellen daher in ihrem eigenen reuseIdentifier isoliert lassen, da Sie sie nicht "ausblenden können".

0
tiritea

Es funktioniert für mich, wenn ich die Erweiterung benutze und innerhalb von layoutSubviews () sofort die Layout-Ansichten aktualisiert.

extension UITableViewCell {

    func removeSeparator() {
        separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
    }
}

override func layoutSubviews() {
    super.layoutSubviews()

    removeSeparator()
}
0
Top

Durch den Code, den alle Antworten haben, werden die Zellen anstelle des Standardwerts auf Null gesetzt. Ich habe das Problem in iOS 11 iPad Pro 12 '' gesehen.

Aber ich habe eine Lösung ("dirty hack"), die einen leeren Abschnitt machen soll, der die Trennlinie zum Ausblenden macht.

Hier ist der Code, den ich verwendet habe:

typedef enum PXSettingsTableSections {
    PXSettingSectionInvite = 0,
    PXSettingSectionAccount,
    PXSettingSectionPrivacy,
    PXSettingSectionCreation,
    PXSettingSectionTest,
    PXSettingSectionAboutHide,  // invisble section just to hide separator Line
    PXSettingSectionFooterHide, // invisble section just to hide separator Line
    PXSettingSectionNumItems,
} PXSettingsTableSectionsType;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return PXSettingSectionNumItems;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case PXSettingSectionInvite: return 1;
        case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
        case PXSettingSectionPrivacy: return 1;
        case PXSettingSectionCreation: return 2;
        case PXSettingSectionTest: return 3;
        case PXSettingSectionAboutHide: return 3;
        default: return 0;
    }
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    switch(section)
    {
        case PXSettingSectionInvite: return nil;
        case PXSettingSectionAccount: return @"Account";
        case PXSettingSectionPrivacy: return @"Privacy";
        case PXSettingSectionCreation: return @"Someting";
        case PXSettingSectionTest: return @"Test";
        case PXSettingSectionAboutHide: return @" ";
        case PXSettingSectionFooterHide: return @" ";
    }
    return nil;
}


- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {

    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
        // [UIColor clearColor] will not work 
        [header.contentView setBackgroundColor:[UIColor whiteColor]];
    }
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    // You can control here the size of one specific section
    if(section == PXSettingSectionAboutHide){
        return 0.0000001; //make it real small
    }
    return 45.0;
}


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

    switch(indexPath.section)
    {
        case PXSettingSectionInvite:
            return self.inviteCell;
        case PXSettingSectionAccount:
            if (isSocialLogin) {
                return self.myWalletCell;
            }
            switch(indexPath.row)
            {
                case 0: return self.changePasswordCell;
                case 1: return self.myWalletCell;
            }
        case PXSettingSectionPrivacy:
            switch(indexPath.row)
        {
            case 0: return self.privateAccountCell;
        }
        case PXSettingSectionCreation:
            switch(indexPath.row)
        {
            case 0: return self.videoResolutionCell;
            case 1: return self.selfieMirrorCell;
        }
        case PXSettingSectionTest:
            switch(indexPath.row)
        {
            case 0: return self.termsOfUseImageCell;
            case 1: return self.attributionCell;
            case 2: return self.aboutCell;
        }
        case PXSettingSectionAboutHide:{
            switch(indexPath.row)
            {
                case 0: return self.clearCacheCell;
                case 1: return self.feedbackCell;
                case 2: return self.logoutCell;
            }
        }
    }

    return self.emptyCell;
}
0
Tiago Mendes

Innerhalb der Tableview-Zellklasse. Setzen Sie diese Codezeile

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
0
M.Nadeeshan

Unter iOS9 hatte ich das Problem, dass das Ändern der Trenneinlagen 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)
}
0
Saren Inden

Legen Sie separatorInset.right = .greatestFiniteMagnitude in Ihrer Zelle fest.

0

Wenn Sie StoryBoard verwenden, können Sie einfach TableView auswählen und unter "Seperator" in "none" ändern.

 if you cant find the Seperator, Click here

0
Tommy