it-swarm-pt.tech

Ocultar linha separadora em um UITableViewCell

Estou personalizando uma UITableView. Eu quero esconder a linha que separa o último celular ... posso fazer isso?

Eu sei que posso fazer tableView.separatorStyle = UITableViewCellStyle.None, mas isso afetaria all as células do tableView. Eu quero apenas afetar minha última célula.

204
Safari

em viewDidLoad, adicione esta linha:

self.tableView.separatorColor = [UIColor clearColor];

e em cellForRowAtIndexPath

para versões inferiores do iOS 

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

para versões superiores do iOS 7 (incluindo o iOS 8)

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

Você pode usar o seguinte código:

Rápido :

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

ou: 

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

para a margem padrão: 

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

para mostrar separador de ponta a ponta 

cell.separatorInset = .zero

Objetivo-C:

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

Para acompanhar a resposta de Hiren.

em ViewDidLoad e a seguinte linha:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Ou, se você estiver usando XIB ou Storyboards, altere " separador " para " none ":

Interface builder

E em CellForRowAtIndexPath adicione isto:

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];

Aqui está um exemplo do resultado onde eu exibo uma tableview com células dinâmicas (mas só tem uma única com conteúdo). O resultado é que apenas aquele tem um separador e nem todas as tableview "fictícias" adicionam automaticamente para preencher a tela.

enter image description here

Espero que isto ajude.

EDIT: Para quem não lê sempre os comentários, existe uma maneira melhor de fazer isso com algumas linhas de código: 

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

Se você não quiser desenhar o separador sozinho, use isto:

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

Esta API está disponível apenas a partir do iOS 7.

50
Kemenaran

meu ambiente de desenvolvimento é

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

respostas acima não funcionam totalmente para mim

depois de tentar, minha solução de trabalho final é:

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

e o efeito é: enter image description here

29
crifan

Melhor solução para iOS 7 e 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);
    }
}

Se o seu aplicativo é rotativo - use 3000.0f para inserir a esquerda ou calcá-lo em tempo real. Se você tentar definir a inserção correta, terá uma parte visível do separador no lado esquerdo da célula no iOS 8.

8
Sound Blaster

Em Swift 3 e Swift 4 , você pode escrever uma extensão para UITableViewCell assim:

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)
  }
}

Então você pode usar isso como abaixo (quando a célula é sua instância de célula):

cell.hideSeparator()
cell.showSeparator()

É realmente melhor atribuir a largura da célula de exibição de tabela como inserção à esquerda, em vez de atribuí-la a um número aleatório. Porque em algumas dimensões de tela, talvez não agora, mas no futuro seus separadores ainda podem ser visíveis porque esse número aleatório pode não ser suficiente. Além disso, no iPad no modo paisagem, você não pode garantir que seus separadores estarão sempre invisíveis.

8
pandaren codemaster

No iOS 7, o separador de células do estilo agrupado UITableView parece um pouco diferente. Parece um pouco assim:

enter image description here

Eu tentei Kemenaran's resposta de fazer isso:

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

No entanto, isso não parece funcionar para mim. Não sei porquê. Então eu decidi usar o Hiren's answer , mas usando UIView ao invés de UIImageView, e desenha a linha no estilo iOS 7:

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];
}

Se você usar isso, certifique-se de conectar a altura de exibição de tabela correta na segunda instrução if. Espero que isso seja útil para alguém.

7
Enrico Susatyo

Em sua subclasse UITableViewCell, substitua layoutSubviews e oculte o _UITableViewCellSeparatorView. Funciona no iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

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

Use esta subclasse, set separatorInset não funciona para o iOS 9.2.1, o conteúdo seria espremido. 

@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

Eu não acredito que esta abordagem funcionará sob qualquer circunstância com células dinâmicas ...

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

Não importa qual método tableview você faça para as células dinâmicas, a célula na qual você alterou a propriedade inserir sempre terá a propriedade inserir definida agora toda vez que ela for demarcada, causando uma invasão de separadores de linhas ausentes ... Isso é até você mude você mesmo.

Algo assim funcionou para mim:

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)
}

Dessa forma, você atualiza o estado da estrutura de dados em todas as cargas

4
Greg Price

O mais simples e lógico é fazer isso:

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

Na maioria dos casos, você não quer ver apenas o último separador tableCiewCell. E essa abordagem remove apenas o último separador tableViewCell e você não precisa pensar em problemas de autolayout (ou seja, dispositivo rotativo) ou valores de código de barras para configurar inserções de separador.

4
rostislawk

Em Swift usando 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)
    }
}

Nota: este trecho acima funcionará no UITableView usando células dinâmicas. O único problema que você pode encontrar é quando você usa células estáticas com categorias, um tipo de separador diferente de none e um estilo agrupado para a exibição de tabela. De fato, neste caso particular, não ocultará a última célula de cada categoria. Para superar isso, a solução que eu encontrei foi para definir o separador de célula (através de IB) para nenhum e, em seguida, criar e adicionar manualmente (através de código) sua exibição de linha para cada célula. Por exemplo, por favor, verifique o trecho abaixo:

/*
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

Usando Swift 3 e adotando o método de hacking mais rápido, você pode melhorar o código usando extensions:

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)
            }
        }
    }

}

Então, quando você configurar o celular:

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

se a resposta aceita não funcionar, você pode tentar isto:

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

É ótimo ;)

2
debiasej

Rápido:

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
}

Objetivo-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

Em 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

Para o Swift 2:

adicione a seguinte linha para viewDidLoad():

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

Não consegui ocultar o separador em uma célula específica, exceto usando a seguinte solução alternativa

- (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)

funciona bem no iOS 10.2

enter image description here

1
katwal-Dipak

Você tem que pegar uma célula customizada e adicionar uma restrição Label e set, tal como o label deve cobrir toda a área da célula. E escreva a linha abaixo no construtor.

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

Também defina a margem de layout UITableView como segue

tblSignup.layoutMargins = UIEdgeInsetsZero;
1
Coder_A_D

Experimente o código abaixo, pode ajudá-lo a resolver seu problema

- (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

Minha exigência era ocultar o separador entre a quarta e a quinta célula. Eu consegui isso por

    -(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

A melhor maneira de conseguir isso é desativar os separadores de linha padrão, subclasse UITableViewCell e adicionar um separador de linha personalizado como uma subvisualização do contentView - veja abaixo uma célula personalizada que é usada para apresentar um objeto do tipo SNStock que possui duas propriedades de string, ticker e 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()
  } 
}

Para desativar o uso do separador de linha padrão, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. O lado do consumidor é relativamente simples, veja o exemplo abaixo:

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

Para o iOS7 e acima, a maneira mais limpa é usar o INFINITY em vez do valor codificado. Você não precisa se preocupar em atualizar a célula quando a tela gira.

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

Como (muitos) outros apontaram, você pode facilmente ocultar os separadores todos UITableViewCell simplesmente desativando-os para o UITableView inteiro; por exemplo, no seu UITableViewController

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

Infelizmente, é um verdadeiro PITA para fazer em uma base por célula, que é o que você está realmente perguntando.

Pessoalmente, eu tentei numerosas permutações de alterar o cell.separatorInset.left, novamente, como (muitos) outros sugeriram, mas o problema é, para citar a Apple (grifo nosso):

"... Você pode usar essa propriedade para adicionar espaço entre os conteúdos da célula atual e as bordas esquerda e direita da tabela. Valores de inserção positivos movem o conteúdo da célula e o separador de célula para dentro e longe das bordas da mesa ... "

Portanto, se você tentar "ocultar" o separador, empurrando-o para fora da tela à direita, você pode acabar também recuando o contentView da célula. Como sugerido pelo crifan, você pode tentar compensar esse efeito colateral desagradável configurando cell.indentationWidth e cell.indentationLevel apropriadamente para mover tudo de volta, mas descobri que isso também não é confiável (o conteúdo ainda está sendo indentado ...).

A maneira mais confiável que eu encontrei é sobre-montar layoutSubviews em uma subclasse UITableViewCell simples e definir o right inset para que ele bata na inserção esquerda, fazendo com que o separador tenha 0 width e seja tão invisível [isso precisa para ser feito em layoutSubviews para manipular rotações automaticamente]. Eu também adiciono um método de conveniência à minha subclasse para ativar isso.

@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

Ressalva: não há uma maneira confiável de restaurar o original insert direito, então você não pode 'un-hide' o separador, daí porque eu estou usando um método irreversível hideSeparator (vs expondo separatorIsHidden). Por favor, note que o separadorInclusive persiste em todas as células reutilizadas, então, porque você não pode 'un-hide', você precisa manter essas células separadoras isoladas em seu próprio reuseIdentifier.

0
tiritea

Funciona para mim quando uso a extensão e chamo no layoutSubviews () para atualizar as visualizações de layout imediatamente.

extension UITableViewCell {

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

override func layoutSubviews() {
    super.layoutSubviews()

    removeSeparator()
}
0
Top

O código que todas as respostas têm fará o preenchimento de células igual a zero em vez do valor padrão. Eu vi o problema em iOS 11 iPad Pro 12 ''

Mas eu tenho uma solução ("hack sujo") que é fazer uma seção vazia que fará com que a linha separadora se esconda.

Aqui está o código que usei:

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

Dentro da classe de célula tableview. coloque essa linha de código

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

No iOS9, tive o problema de que a alteração das inserções do separador também afeta o posicionamento do text- e detailLabel.

Eu resolvi isso com isso

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
0
Saren Inden

Defina separatorInset.right = .greatestFiniteMagnitude no seu celular.

0
Matthew Korporaal

Se você estiver usando o StoryBoard, basta simplesmente selecionar TableView e, em "Seperator", alterá-lo para "none"

if you cant find the Seperator, Click here

0
Tommy