Ocultar línea de separación en un UITableViewCell

250

Estoy personalizando a UITableView. Quiero ocultar la línea que se separa en la última celda ... ¿puedo hacer esto?

Sé que puedo hacerlo, tableView.separatorStyle = UITableViewCellStyle.Nonepero eso afectaría a todas las celdas de tableView. Quiero que solo afecte a mi última celda.

Safari
fuente
Tu pregunta respondió a la mía. tableView.separatorStyle = UITableViewCellStyle.Ninguna era la línea que necesitaba
Malachi Holden

Respuestas:

371

en viewDidLoad, agregue esta línea:

self.tableView.separatorColor = [UIColor clearColor];

y en cellForRowAtIndexPath:

para versiones inferiores de 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 versiones superiores de iOS 7 (incluido iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Hiren
fuente
44
Esto funcionará en iOS7 y iOS8. Efectivamente exprime el separador a cero. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris
99
Un recordatorio: cuando su iDevice es iPad y la celda usa AutoLayout, el valor devuelto por "cell.bounds.size.width" puede no ser igual al ancho real de la celda. Así que siempre uso "tableView.frame.size.width" en lugar de "cell.bounds.size.width".
Veight Zhou
55
Tenga en cuenta: debe usar en [cell.contentView addSubview:line]lugar de[cell addSubview:line]
Anastasia
66
change cell.separatorInset left inset también cambiará el contenido izquierdo de la celda. No solo la línea de separación. De apple doc: "Puede usar esta propiedad para agregar espacio entre el contenido de la celda actual y los bordes izquierdo y derecho de la tabla. Los valores de inserción positivos mueven el contenido de la celda y el separador de celda hacia adentro y lejos de los bordes de la tabla".
zgjie
99
Mala idea. Nunca debe agregar subvistas a una celda cellForRowAtIndexPath. Recuerda que las células se reutilizan. Cada vez que se reutilice esta celda, agregará otra vista de línea de separación. En listas grandes, esto puede afectar el rendimiento del desplazamiento. Y simplemente no es la forma correcta de hacerlo.
Dave Batton
247

Puedes usar el siguiente código:

Rápido:

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

o:

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

para el margen predeterminado:

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

para mostrar el separador de extremo a extremo

cell.separatorInset = .zero

C objetivo:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Avinash
fuente
No funciona para un grupo UITableView, mientras que la respuesta aceptada sí.
Aleks N.
3
Esto no funciona para iOS9, lo self.tableView.separatorColor = [UIColor clearColor];arregló.
Ben
1
Es un truco completo, pero lo que funciona en iOS 9 es: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer
Esta es la forma en que funciona para mí en iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);si no resta el valor cell.layoutMargins.left, la línea de separación se dibuja desde el borde izquierdo hasta el margen izquierdo (si tiene alguno).
Alexandre OS
3
Esto empuja cualquier textLabelfuera de la pantalla.
aehlke
99

Para dar seguimiento a la respuesta de Hiren .

en ViewDidLoad y la siguiente línea:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

O, si está utilizando XIB o Storyboards, cambie " separador " a " ninguno ":

Constructor de interfaz

Y en CellForRowAtIndexPath agregue esto:

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

Aquí hay un ejemplo del resultado donde visualizo una vista de tabla con Celdas dinámicas (pero solo tengo una sola con contenido). El resultado es que solo ese tiene un separador y no todas las vistas de tabla "falsas" se agregan automáticamente para llenar la pantalla.

ingrese la descripción de la imagen aquí

Espero que esto ayude.

EDITAR: Para aquellos que no siempre leen los comentarios, en realidad hay una mejor manera de hacerlo con unas pocas líneas de código:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
Benjamín
fuente
Creo que, para ocultar la línea de separación, este es el enfoque correcto. self.tableView.separatorStyle = .none
arango_86
52

Si no desea dibujar el separador usted mismo, use esto:

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

Sin embargo, esta API solo está disponible a partir de iOS 7.

Kemenaran
fuente
8
separatorInsetparece insertar el contenido de la celda, así como el separador, lo que requiere otro truco para compensar:cell.IndentationWidth = -10000;
crishoj
23
Un mejor método es establecer separatorInset0 en la parte superior, izquierda e inferior y el ancho de la celda a la derecha: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); esto evita la necesidad de ajustar cualquier otra propiedad de la celda.
bryguy1300
Si está utilizando el ancho de los límites de las celdas para el recuadro, es posible que deba volver a calcular cuando la interfaz gira.
AndrewR
Tenga en cuenta que si la celda a la que hace esto se reutiliza para dibujar otra celda para la que no tenía la intención de ocultar el separador, el separador también desaparecerá.
Michael Peterson el
1
UIEdgeInsetsMake (0, 10000, 0, 0); trabajado -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); No. Supongo que es porque tengo el desagradable hábito de mantener vcs de 3.5 "en xibs y tableros de estilo cuyos artefactos en dispositivos de 4" + causan 375-320px sección = 55px permanece. (en voz de yoda) y muy feo es!
Anton Tropashko
29

mi entorno de desarrollo es

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

las respuestas anteriores no funcionan completamente para mí

después de intentarlo, mi solución que finalmente funciona es:

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

y el efecto es: ingrese la descripción de la imagen aquí

crifan
fuente
20

Establecer separatorInset.right = .greatestFiniteMagnitudeen tu celular.

Matthew Korporaal
fuente
awakeFromNibactivar esto puede hacer que toda la pantalla parpadeeapplicationDidBecomeActive
Breadbin
Esto funciona iOS 12.2, en el dispositivo, desde la creación programática UITableViewCell. Agradable.
Womble
Establecer el separador correcto funcionó para mí cuando lo configuro en cellForRowAt. Las mejores soluciones. Funciona de iOS 10 a 13 para mí. Probado en iOS 10, 12 y 13. Cuando se establece el margen izquierdo, entonces no funciona para iOS 10.
Ariel Bogdziewicz
18

En Swift 3, Swift 4 y Swift 5 , puede escribir una extensión para UITableViewCell de esta manera:

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

Luego puede usar esto de la siguiente manera (cuando la celda es su instancia de celda):

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

Es realmente mejor asignar el ancho de la celda de vista de tabla como el recuadro izquierdo en lugar de asignarle un número aleatorio. Porque en algunas dimensiones de la pantalla, tal vez no ahora, pero en el futuro sus separadores aún pueden ser visibles porque ese número aleatorio puede no ser suficiente. Además, en iPad en modo horizontal no puede garantizar que sus separadores siempre serán invisibles.

Okhan Okbay
fuente
Esto no funciona para UITableView de estilo agrupado. ¿Tiene solución para caso agrupado?
zslavman
8

Mejor solución para iOS 7 y 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);
    }
}

Si su aplicación es giratoria, use 3000.0f para la constante de inserción izquierda o calcule sobre la marcha. Si intenta configurar el recuadro derecho, tiene una parte visible del separador en el lado izquierdo de la celda en iOS 8.

Sound Blaster
fuente
1
¿Por qué usar un número aleatorio cuando podría hacer algo como esto: MAX ([[UIScreen mainScreen] límites] .size.width, [[UIScreen mainScreen] límites] .size.height); para asegurarse de que siempre se haya ido
Daniel Galasko
7

En iOS 7, el separador de celdas de estilo agrupado UITableView se ve un poco diferente. Se parece un poco a esto:

ingrese la descripción de la imagen aquí

Intenté la respuesta de Kemenaran de hacer esto:

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

Sin embargo, eso no parece funcionar para mí. No estoy seguro de por qué. Así que decidí usar la respuesta de Hiren , pero usando en UIViewlugar de UIImageViewy dibujando la línea en el 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];
}

Si usa esto, asegúrese de conectar la altura de vista de tabla correcta en la segunda instrucción if. Espero que esto sea útil para alguien.

Enrico Susatyo
fuente
7

En su subclase UITableViewCell, anule layoutSubviews y oculte _UITableViewCellSeparatorView. Funciona bajo iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
Tualatrix Chou
fuente
ninguna de las soluciones anteriores funcionó, esto funciona en iOS 12
Abdul Waheed
Esto podría ser rechazado de la App Store por acceder a API privadas.
Elliot Fiske
5

No creo que este enfoque funcione bajo ninguna circunstancia con celdas dinámicas ...

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

No importa en qué método de vista de tabla lo haga para las celdas dinámicas, la celda en la que cambió la propiedad del recuadro siempre tendrá la propiedad del recuadro establecida ahora cada vez que se elimine, causando un alboroto de separadores de líneas faltantes ... Eso es hasta que cámbialo tú mismo.

Algo como esto funcionó para mí:

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

De esa manera, actualiza su estado de estructura de datos en cada carga

Greg Price
fuente
4

En Swift con 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 fragmento anterior funcionará en UITableView usando celdas dinámicas. El único problema que puede encontrar es cuando usa celdas estáticas con categorías, un tipo de separador diferente a ninguno y un estilo agrupado para la vista de tabla. De hecho, en este caso particular no ocultará la última celda de cada categoría. Para superar eso, la solución que encontré fue establecer el separador de celdas (a través de IB) en ninguno y luego crear y agregar manualmente (a través del código) su vista de línea a cada celda. Por ejemplo, revise el fragmento a continuación:

/*
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)
    }
}
Rey Mago
fuente
En mi proyecto, esto funciona para las celdas estáticas pero no para las dinámicas. En el último caso, el contenido de la última celda se desplaza hacia la derecha (al igual que la línea de separación). Alguna idea, ¿por qué esto podría suceder?
Bastian
El primer fragmento de la respuesta anterior funcionará en UITableView usando celdas dinámicas. El único problema que puede encontrar es cuando usa celdas estáticas con categorías, un tipo de separador diferente a ninguno y un estilo agrupado para la vista de tabla. De hecho, en este caso particular no ocultará la última celda de cada categoría. Para superar eso, la solución que encontré fue establecer el separador de celdas (a través de IB) en ninguno y luego crear y agregar manualmente (a través del código) su vista de línea a cada celda. Por ejemplo, verifique el segundo fragmento de la respuesta anterior.
King-Wizard
cambia el texto (título), ¡tan inútil!
user155
4

Utilice esta subclase, el conjunto separatorInsetno funciona para iOS 9.2.1, el contenido se exprimiría.

@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
fuente
4

Lo mucho más simple y lógico es hacer esto:

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

En la mayoría de los casos, no desea ver solo el último separador tableCiewCell. Y este enfoque elimina solo el último separador tableViewCell, y no necesita pensar en problemas de auto-distribución (es decir, dispositivo giratorio) o valores de código duro para configurar insertos separadores.

Rostislawk
fuente
1
¡Bienvenido a Stack Overflow! Una mejor respuesta para futuros lectores explicaría por qué esto es más simple y más lógico.
CGritton
Una buena solución!
geek1706
3

En willdisplaycell:

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

Usando Swift 3 y adoptando el método de piratería más rápido, puede mejorar el código usando extensiones :

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

}

Luego, cuando configuras la celda:

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
fuente
2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
Gank
fuente
2

La mejor manera de lograr esto es desactivar los separadores de línea predeterminados, la subclase UITableViewCelly agregar un separador de línea personalizado como una subvista de contentView: vea a continuación una celda personalizada que se utiliza para presentar un objeto de tipo SNStockque tiene dos propiedades de cadena tickery 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 desactivar el uso del separador de línea por defecto, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. El lado del consumidor es relativamente simple, vea el ejemplo a continuación:

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
fuente
2

Para Swift 2:

agregue la siguiente línea a viewDidLoad():

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

Si la respuesta aceptada no funciona, puede intentar esto:

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

Es genial ;)

debiasej
fuente
1

Pruebe el siguiente código, podría ayudarlo a resolver su 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;
}
Nakkeeran
fuente
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
fuente
1

Debe tomar una celda personalizada y agregar Etiqueta y establecer restricciones, como que la etiqueta debe cubrir toda el área de la celda. y escribe la siguiente línea en constructor.

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

Establezca también el margen de diseño de UITableView de la siguiente manera

tblSignup.layoutMargins = UIEdgeInsetsZero;
Codificador_A_D
fuente
1

No pude ocultar el separador en una celda específica, excepto usar la siguiente solución

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

Para iOS7 y superior, la forma más limpia es usar INFINITY en lugar de un valor codificado. No tiene que preocuparse por actualizar la celda cuando la pantalla gira.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Xchord
fuente
3
Tenga cuidado: el uso de INFINITY provoca una excepción de tiempo de ejecución en iOS9
AndrewR
1

Como (muchos) otros han señalado, puede ocultar fácilmente todos los separadores UITableViewCell simplemente apagándolos para todo el UITableView; por ejemplo, en su UITableViewController

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

Desafortunadamente, es una verdadera PITA que hacer en una celda , que es lo que realmente está preguntando.

Personalmente, he probado numerosas permutaciones para cambiar el cell.separatorInset.left , nuevamente, como (muchos) otros han sugerido, pero el problema es, para citar a Apple (énfasis agregado):

" ... Puede usar esta propiedad para agregar espacio entre el contenido de la celda actual y los bordes izquierdo y derecho de la tabla. Los valores de inserción positivos mueven el contenido de la celda y el separador de celda hacia adentro y lejos de los bordes de la tabla ... "

Entonces, si intenta 'ocultar' el separador empujándolo fuera de la pantalla hacia la derecha, también puede terminar sangrando el contenido de su celda también. Según lo sugerido por crifan, puede intentar compensar este desagradable efecto secundario configurando cell.indentationWidthycell.indentationLevel moviendo adecuadamente todo hacia atrás, pero he descubierto que esto tampoco es confiable (el contenido aún se sangra ...).

La forma más confiable que he encontrado es layoutSubviewsanular en una simple subclase UITableViewCell y establecer el recuadro derecho para que golpee el recuadro izquierdo, haciendo que el separador tenga un ancho 0 y tan invisible [esto debe hacerse en layoutSubviews para automáticamente manejar rotaciones]. También agrego un método de conveniencia a mi subclase para activar esto.

@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

Advertencia: no hay una forma confiable de restaurar el recuadro derecho original , por lo que no puede 'des-ocultar' el separador, por lo tanto, estoy usando un hideSeparatormétodo irreversible (en lugar de exponer separatorIsHidden). Tenga en cuenta que el separatorInset persiste en las celdas reutilizadas, por lo que, debido a que no puede 'des-ocultar', debe mantener estas celdas separadoras ocultas aisladas en su propio reuseIdentifier.

tiritea
fuente
1

Mi requisito era ocultar el separador entre la cuarta y la quinta celda. Lo logré 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);
    }
}
SMS
fuente
1

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
}

C objetivo:

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

Dentro de la clase de celda tableview. pon estas linea de codigo

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
M. Nadeeshan
fuente
No tiene en cuenta los cambios de diseño de dispositivo / escena.
Womble
0

En iOS9 tuve el problema de que cambiar las inserciones del separador también afecta el posicionamiento de la etiqueta text- and detailLabel.

Lo resolví con esto

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Saren Inden
fuente
No funciona con la clase UITableViewCell: TextLabel y DetailTextLabel se alejan de la celda.
Nik Kov