iOS8 UITableView separator inset 0 no funciona

Tengo una aplicación donde la inserción del separador de UITableView está configurada en valores personalizados: a la derecha 0 , a la izquierda 0 . Esto funciona perfectamente en iOS 7.x , sin embargo, en iOS 8.0 veo que la inserción del separador se establece en el valor predeterminado de 15 a la derecha. Aunque en los archivos xib se establece en 0 , todavía se muestra incorrectamente.

¿Cómo UITableViewCell márgenes del separador UITableViewCell ?

iOS 8.0 presenta la propiedad layoutMargins en celdas Y vistas de tabla.

Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla.

Además, Apple ha agregado una propiedad a su celda que evitará que herede la configuración de márgenes de su Vista de tabla. Cuando se establece esta propiedad, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Piense en ello como una anulación.

Esta propiedad se denomina preservesSuperviewLayoutMargins , y establecerla en NO permitirá que la configuración layoutMargin la celda anule el layoutMargin se establezca en TableView. Tanto ahorra tiempo ( no es necesario modificar la configuración de la vista de tabla ), y es más conciso. Consulte la respuesta de Mike Abdullah para obtener una explicación detallada.

NOTA: lo que sigue es una implementación limpia para una configuración de margen de nivel de celda , como se expresa en la respuesta de Mike Abdullah. Configurar las reservas de su celdaSuperviewLayoutMargins = NO garantizará que su vista de tabla no anule la configuración de la celda. Si realmente desea que su vista de tabla completa tenga márgenes consistentes, ajuste su código en consecuencia.

Configure los márgenes de su celda:

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { // Remove seperator inset if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } // Prevent the cell from inheriting the Table View's margin settings if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { [cell setPreservesSuperviewLayoutMargins:NO]; } // Explictly set your cell's layout margins if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Swift 4:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { // Remove seperator inset if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) { cell.separatorInset = .zero } // Prevent the cell from inheriting the Table View's margin settings if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } // Explictly set your cell's layout margins if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) { cell.layoutMargins = .zero } } 

Establecer la propiedad preserveSuperviewLayoutMargins en su celda a NO debe evitar que su vista de tabla anule los márgenes de su celda. En algunos casos, parece no funcionar correctamente.

Si todo falla, puede aplicar fuerza bruta a los márgenes de su Vista de tabla:

 -(void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // Force your tableview margins (this may be a bad idea) if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) { [self.tableView setLayoutMargins:UIEdgeInsetsZero]; } } 

Swift 4:

 func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Force your tableview margins (this may be a bad idea) if tableView.responds(to: #selector(setter: UITableView.separatorInset)) { tableView.separatorInset = .zero } if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) { tableView.layoutMargins = .zero } } 

… y ahí tienes! Esto debería funcionar en iOS 7 y 8.

EDITAR: Mohamed Saleh me llamó la atención sobre un posible cambio en iOS 9. Es posible que deba establecer cellLayoutMarginsFollowReadableWidth Table View en NO si desea personalizar las inserciones o los márgenes. Su millaje puede variar, esto no está documentado muy bien.

Esta propiedad solo existe en iOS 9, así que asegúrese de verificarla antes de configurarla.

 if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { myTableView.cellLayoutMarginsFollowReadableWidth = NO; } 

Swift 4:

 if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) { myTableView.cellLayoutMarginsFollowReadableWidth = false } 

(El código anterior del separador 0 de UITableView de iOS 8 no funciona )

EDITAR: Aquí hay un enfoque puro de Interface Builder:

TableViewAttributesInspector TableViewCellSizeInspector

NOTA: iOS 11 cambia y simplifica gran parte de este comportamiento, se actualizará próximamente …

Arg !!! Después de jugar haciendo esto en tu subclase de Cell :

 - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsZero; } 

o estableciendo cell.layoutMargins = UIEdgeInsetsZero; me lo arregló

Tomemos un momento para comprender el problema antes de cargar a ciegas para tratar de arreglarlo.

Un rápido vistazo al depurador le dirá que las líneas separadoras son subvistas de UITableViewCell . Parece que la célula misma asume una gran cantidad de responsabilidad por el diseño de estas líneas.

iOS 8 introduce el concepto de márgenes de diseño . De forma predeterminada, los márgenes de diseño de una vista son de 8 8pt en todos los lados, y se heredan de las vistas de antepasados.

Lo mejor que podemos decir es que, al diseñar su línea de separación, UITableViewCell elige respetar el margen de diseño de la izquierda, usándolo para restringir el recuadro de la izquierda.

Poniendo todo eso junto, para lograr el recuadro deseado de verdaderamente cero, tenemos que:

  • Establezca el margen de diseño izquierdo en 0
  • Detenga cualquier margen heredado anulando ese

Puesto así, es una tarea bastante simple de lograr:

 cell.layoutMargins = UIEdgeInsetsZero; cell.preservesSuperviewLayoutMargins = NO; 

Cosas a tener en cuenta:

  • Este código solo necesita ejecutarse una vez por celda (después de todo, solo está configurando las propiedades de la celda), y no hay nada especial cuando elige ejecutarlo. Haz lo que te parezca más limpio.
  • Lamentablemente, ninguna de las propiedades está disponible para configurar en el Interface Builder, pero puede especificar un atributo de tiempo de ejecución definido por el usuario para preservesSuperviewLayoutMargins si así lo desea.
  • Claramente, si su aplicación también se dirige a versiones anteriores del sistema operativo, deberá evitar ejecutar el código anterior hasta que se ejecute en iOS 8 o superior.
  • En lugar de establecer preservesSuperviewLayoutMargins , puede configurar vistas ancestrales (como la tabla) para tener 0 margen izquierdo también, pero esto parece inherentemente más propenso a errores ya que no controla toda la jerarquía.
  • Probablemente sería un poco más limpio establecer solo el margen izquierdo en 0 y dejar los otros.
  • Si desea tener un recuadro 0 en los separadores “extra” que UITableView dibuja en la parte inferior de las tablas de estilo simple, supongo que esto requerirá especificar la misma configuración a nivel de tabla también (¡no he probado este!)

Creo que esta es la misma pregunta que hice aquí: Eliminar SeparatorInset en iOS 8 UITableView para XCode 6 iPhone Simulator

En iOS 8 , hay una nueva propiedad para todos los objetos heredados de UIView . Por lo tanto, la solución para configurar SeparatorInset en iOS 7.x no podrá eliminar el espacio en blanco que ve en UITableView en iOS 8.

La nueva propiedad se llama ” layoutMargins “.

 @property(nonatomic) UIEdgeInsets layoutMargins Description The default spacing to use when laying out content in the view. Availability iOS (8.0 and later) Declared In UIView.h Reference UIView Class Reference 

iOS 8 UITableView setSeparatorInset: UIEdgeInsetsZero setLayoutMargins: UIEdgeInsetsZero

La solución:-

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { [tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) { [tableView setLayoutMargins:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Si establece cell.layoutMargins = UIEdgeInsetsZero; sin verificar si el layoutMargins existe, la aplicación se bloqueará en iOS 7.x. Por lo tanto, la mejor manera sería verificar si el layoutMargins existe primero antes de setLayoutMargins:UIEdgeInsetsZero .

Puede usar UIAppearance una vez, al inicio de la aplicación (antes de que se cargue la IU), para establecerlo como configuración global predeterminada:

 // iOS 7: [[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine]; [[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero]; [[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero]; // iOS 8: if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) { [[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero]; [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero]; [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO]; } 

De esta forma, mantendrá limpio el código de UIViewController y siempre podrá anularlo si lo desea.

Versión Swift

iOS presenta la propiedad layoutMargins en celdas Y vistas de tabla.

Esta propiedad no está disponible en iOS 7.0, por lo que debe asegurarse de verificar antes de asignarla.

Sin embargo, Apple ha agregado una propiedad llamada preservasSuperviewLayoutMargins a su celda que evitará que herede la configuración de márgenes de su Vista de tabla. De esta manera, sus celdas pueden configurar sus propios márgenes independientemente de la vista de tabla. Piense en ello como una anulación.

Esta propiedad se denomina conservasSuperviewLayoutMargins y su configuración en NO puede permitirle anular la configuración de layoutMargin de su vista de tabla con la configuración de layoutMargin de su propia celda. Tanto ahorra tiempo ( no es necesario modificar la configuración de la vista de tabla ), y es más conciso. Consulte la respuesta de Mike Abdullah para obtener una explicación detallada.

NOTA: esta es la implementación correcta y menos desordenada, como se expresa en la respuesta de Mike Abdullah; configurar las reservas de su celdaSuperviewLayoutMargins = NO asegurará que su vista de tabla no anule la configuración de la celda.

Primer paso: configure los márgenes de su celda:

 /* Tells the delegate that the table view is about to draw a cell for a particular row. */ override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // Remove separator inset if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset = UIEdgeInsetsZero } // Prevent the cell from inheriting the Table View's margin settings if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") { cell.preservesSuperviewLayoutMargins = false } // Explictly set your cell's layout margins if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } } 

Establecer la propiedad preserveSuperviewLayoutMargins en su celda a NO debe evitar que su vista de tabla anule los márgenes de su celda. En algunos casos, parece que no funciona correctamente.

Segundo paso: solo si todo falla, puede aplicar fuerza bruta a los márgenes de la Vista de tabla:

 /* Called to notify the view controller that its view has just laid out its subviews. */ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Force your tableview margins (this may be a bad idea) if self.tableView.respondsToSelector("setSeparatorInset:") { self.tableView.separatorInset = UIEdgeInsetsZero } if self.tableView.respondsToSelector("setLayoutMargins:") { self.tableView.layoutMargins = UIEdgeInsetsZero } } 

… y ahí tienes! Esto debería funcionar en iOS 8 y iOS 7.

Nota: probado con iOS 8.1 y 7.1, en mi caso solo necesitaba usar el primer paso de esta explicación.

El segundo paso solo es necesario si tiene celdas despobladas debajo de las celdas representadas, es decir. si la tabla es más grande que el número de filas en el modelo de tabla. No hacer el segundo paso daría lugar a diferentes desplazamientos de separador.

En Swift es un poco más molesto porque layoutMargins es una propiedad, por lo que debes anular el getter y el setter.

 override var layoutMargins: UIEdgeInsets { get { return UIEdgeInsetsZero } set(newVal) {} } 

Esto efectivamente hará layoutMargins solo lectura, que en mi caso está bien.

Para iOS 9 necesitas agregar:

 if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) { myTableView.cellLayoutMarginsFollowReadableWidth = NO; } 

Para más detalles, consulte la pregunta .

Extensión de Swift 2.0

Solo quería compartir una extensión que hice para eliminar los márgenes de los separadores de celdas de la tabla.

 extension UITableViewCell { func removeMargins() { if self.respondsToSelector("setSeparatorInset:") { self.separatorInset = UIEdgeInsetsZero } if self.respondsToSelector("setPreservesSuperviewLayoutMargins:") { self.preservesSuperviewLayoutMargins = false } if self.respondsToSelector("setLayoutMargins:") { self.layoutMargins = UIEdgeInsetsZero } } } 

Usado en contexto:

  let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell cell.removeMargins() return cell 

Rápido:

 override func viewDidLoad() { super.viewDidLoad() if self.tableView.respondsToSelector("setSeparatorInset:") { self.tableView.separatorInset = UIEdgeInsetsZero } if self.tableView.respondsToSelector("setLayoutMargins:") { self.tableView.layoutMargins = UIEdgeInsetsZero } self.tableView.layoutIfNeeded() // <--- this do the magic } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { ... if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset = UIEdgeInsetsZero } if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } return cell } 

Lo hice funcionar al hacer esto:

 tableView.separatorInset = UIEdgeInsetsZero; tableView.layoutMargins = UIEdgeInsetsZero; cell.layoutMargins = UIEdgeInsetsZero; 

Ejemplo de Swift 3.0:

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { // removing seperator inset if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) { cell.separatorInset = .zero } // prevent the cell from inheriting the tableView's margin settings if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) { cell.preservesSuperviewLayoutMargins = false } // explicitly setting cell's layout margins if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) { cell.layoutMargins = .zero } } 

Después de mucha investigación …

Esta es la única forma de controlar completamente estas cosas (que pude encontrar)

Para controlar completamente tanto las inserciones de separador como los márgenes de disposición en cada celda. Haga esto en el método willDisplayCell en su UITableviewDelegate .

 func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.layoutMargins = UIEdgeInsetsZero cell.contentView.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10) cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0) } 

El objeto de celda controla el separador y contentView controla todo lo demás. Si los espacios de inserción de su separador aparecen en un color inesperado, esto debería resolverlo:

 cell.backgroundColor = cell.contentView.backgroundColor 

Para mí, la línea simple hizo el trabajo

 cell.layoutMargins = UIEdgeInsetsZero 

En cuanto a lo que sugirió cdstamper en lugar de la vista de tabla, agregar líneas a continuación en el método de distribución de la composición de la celda funciona para mí.

 - (void)layoutSubviews { [super layoutSubviews]; if ([self respondsToSelector:@selector(setSeparatorInset:)]) [self setSeparatorInset:UIEdgeInsetsZero]; if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { [self setPreservesSuperviewLayoutMargins:NO];; } if ([self respondsToSelector:@selector(setLayoutMargins:)]) { [self setLayoutMargins:UIEdgeInsetsZero]; } } 

Solución simple en Swift para iOS 8 con una UITableViewCell personalizada

 override func awakeFromNib() { super.awakeFromNib() self.layoutMargins = UIEdgeInsetsZero self.separatorInset = UIEdgeInsetsZero } 

De esta forma, configurará layoutMargin y separatorInset solo una vez en lugar de hacerlo para cada willDisplayCell como lo willDisplayCell mayoría de las respuestas anteriores.

Si está utilizando una UITableViewCell personalizada, este es el lugar correcto para hacerlo. De lo contrario, deberías hacerlo en tableView:cellForRowAtIndexPath .

Solo otra sugerencia: no es necesario establecer preservesSuperviewLayoutMargins = false porque el valor predeterminado ya es NO !

Solo agregue el código a continuación puede resolver este progtwig.

¡Buena suerte para ti!

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Utilice el siguiente fragmento de código para evitar problemas de relleno indeseado para UITableView en iOS 8 y 7.

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { [tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) { [tableView setLayoutMargins:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Este es el código que funciona para mí, en Swift:

 override func viewDidLoad() { super.viewDidLoad() ... if tableView.respondsToSelector("setSeparatorInset:") { tableView.separatorInset = UIEdgeInsetsZero } } func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) { if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset.left = CGFloat(0.0) } if tableView.respondsToSelector("setLayoutMargins:") { tableView.layoutMargins = UIEdgeInsetsZero } if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins.left = CGFloat(0.0) } } 

Esto me parece el más limpio (por ahora), ya que todos los ajustes edge / edge de cell / tableView se realizan en el tableView:willDisplayCell:forRowAtIndexPath: sin tableView:cellForRowAtIndexPath: código tableView:cellForRowAtIndexPath: en tableView:cellForRowAtIndexPath:

Por cierto, solo estoy estableciendo el separador / layoutMargins izquierdo de la celda, porque en este caso no quiero arruinar mis restricciones que he configurado en mi celda.

Código actualizado a Swift 2.2:

  override func viewDidLoad() { super.viewDidLoad() if tableView.respondsToSelector(Selector("setSeparatorInset:")) { tableView.separatorInset = UIEdgeInsetsZero } } override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) { if cell.respondsToSelector(Selector("setSeparatorInset:")) { cell.separatorInset.left = CGFloat(0.0) } if tableView.respondsToSelector(Selector("setLayoutMargins:")) { tableView.layoutMargins = UIEdgeInsetsZero } if cell.respondsToSelector(Selector("setLayoutMargins:")) { cell.layoutMargins.left = CGFloat(0.0) } } 

La mayoría de las respuestas muestran separadores insertos y márgenes de diseño que se configuran sobre una variedad de métodos (es decir, viewDidLayoutSubviews , willDisplayCell , etc.) para celdas y tablas, pero he descubierto que poner estos en cellForRowAtIndexPath funciona muy bien. Parece la manera más limpia.

 // kill insets for iOS 8 if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) { cell.preservesSuperviewLayoutMargins = NO; [cell setLayoutMargins:UIEdgeInsetsZero]; } // iOS 7 and later if ([cell respondsToSelector:@selector(setSeparatorInset:)]) [cell setSeparatorInset:UIEdgeInsetsZero]; 

En lugar de actualizar preservesSuperviewLayoutMargins y layoutMargins cada vez que la celda se desplaza (usando willDisplayCell ), sugiero que lo haga una vez en cellForRowAtIndexPath: :

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath) cell.preservesSuperviewLayoutMargins = false cell.layoutMargins = UIEdgeInsetsZero return cell } 

Lukasz responde en Swift:

  // iOS 7: UITableView.appearance().separatorStyle = .SingleLine UITableView.appearance().separatorInset = UIEdgeInsetsZero UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero // iOS 8: if UITableView.instancesRespondToSelector("setLayoutMargins:") { UITableView.appearance().layoutMargins = UIEdgeInsetsZero UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero UITableViewCell.appearance().preservesSuperviewLayoutMargins = false } 

En iOS8:

Agregando esto a mi Subclase UITableViewCell:

 - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsZero; } 

y esto a “tableView: cellForRowAtIndexPath” o “tableView: willDisplayCell”:

 [editCell setSeparatorInset:UIEdgeInsetsZero]; 

Trabajó para mi.

Aquí hay una manera fácil de eliminar globalmente el recuadro.

En UITableViewCell+Extensions.swift :

 import UIKit extension UITableViewCell { override public var layoutMargins: UIEdgeInsets { get { return UIEdgeInsetsZero } set { } } } 

En la application:didFinishLaunchingWithOptions: AppDelegate application:didFinishLaunchingWithOptions: :

  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero 

Puede pensar que a) también sobrescribe separatorInset en la extensión, o bien b) configure el proxy de apariencia para layoutMargins , en su lugar. Ninguno de los dos funcionará. Aunque se indica que separatorInset es una propiedad, intentar anularla como propiedad (o método) genera errores de comstackción. Y establecer el proxy de apariencia para UITableViewCell de layoutMargins (o, para el caso, también establecer los proxies de apariencia para layoutMargins y separatorInset layoutMargins ) no tiene ningún efecto.

Después de haber visto las respuestas en el piso 3, traté de averiguar cuál era la relación de configurar el separador entre TableView y TableViewCell e hice algunas pruebas. Aquí están mis conclusiones:

  1. podemos considerar que establecer el separador de la celda a cero tiene que mover el separador en dos pasos: el primer paso es establecer el separador de la celda en cero. El segundo paso es establecer el margen de salida de la celda a cero.

  2. establece el separador de TableView y el diseño de margen puede afectar el separador de la Celda. Sin embargo, a partir de la prueba, me parece que el separador de TableView parece ser inútil, el margen de salida de TableView realmente puede afectar el margen de salida de la celda .

  3. establecer Cell’s PreservesSuperviewLayoutMargins = false, puede cortar el efecto de margen de distribución de TableView en las celdas.

  4. una de las soluciones:

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = UITableViewCell() cell.preservesSuperviewLayoutMargins = false cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero return cell } 

Esta es mi solución. Esto se aplica a la subclase de celda personalizada, solo agréguelos a la subclase.

  1.  - (UIEdgeInsets)layoutMargins { return UIEdgeInsetsMake(0, 10, 0, 10); } 

2.

 self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10); 

Y es conveniente que pueda personalizar la posición del separador sin pedirle a su diseñador que dibuje uno para usted ……….

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... Get the cell cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20); // others return cell; } 

Para cualquier celda específica, quiere ocultar el separador.

De una manera más compacta que la respuesta más votada …

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell respondsToSelector:@selector(setSeparatorInset:)] && [cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)] && [cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setSeparatorInset:UIEdgeInsetsZero]; [cell setPreservesSuperviewLayoutMargins:NO]; [cell setLayoutMargins:UIEdgeInsetsZero]; } 

}

Agregar este fragmento, simple y elegante en Swift funciona para mí en iOS8 🙂

  // tableview single line func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.preservesSuperviewLayoutMargins = false cell.layoutMargins = UIEdgeInsetsZero } 

Esto funcionó perfectamente para mí en iOS 8 y iOS 9.

Para OBJ-C

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { [tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) { [tableView setLayoutMargins:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } return cell; }