¿Hay alguna manera de hacer que las celdas UITableView en iOS 7 no tengan un salto de línea en el separador?

Noté que en iOS 7, UITableViewCells tiene un salto de línea en el separador de la celda que iOS 6 no tiene. ¿Hay alguna manera de deshacerse de este salto de línea? Cambiar el separador a ninguno y luego hacer UIViews con el color del separador sigue causando que el separador blanco se produzca independientemente.

Para iOS7:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } 

Para iOS8:

Primero configure su vista de tabla de la siguiente manera:

 if ([self.tableView respondsToSelector:@selector(layoutMargins)]) { self.tableView.layoutMargins = UIEdgeInsetsZero; } 

Luego, en su método cellForRowAtIndexPath: configure la celda de la siguiente manera:

 if ([cell respondsToSelector:@selector(layoutMargins)]) { cell.layoutMargins = UIEdgeInsetsZero; } 

Nota: Incluye tanto layoutMargins como separatorInset , para admitir ambas versiones de iOS

También puede configurar el ‘ Separator Inset ‘ del guión gráfico:

enter image description here

enter image description here

Si desea admitir versiones anteriores de iOS, debe verificar la disponibilidad de este método antes de llamarlo:

 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } 

Lo averigué.

 [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 

La respuesta seleccionada no funcionó para mí. Pero esto sí y funciona desde iOS 2.0:

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

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 ** 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 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 seperator 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 no funcionar 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 usando 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.

Para una solución permanente en toda la aplicación, llámalo en la aplicación: didFinishLaunching … cualquier tabla vista será “arreglada”

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero]; } 

Y en iOS 8, basado en la publicación de Seth McFarlane aquí , debe comenzar a trabajar con layoutMargins. Lo siguiente lo hizo por mí:

  1. En ApplicationDidFinishLaunching, ejecute lo siguiente:

     if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) { [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero]; } 
  2. Cree la siguiente categoría en UITableView:

     @interface UITableView(WJAdditions) -(void) wjZeroSeparatorInset; @end @implementation UITableView (WJAdditions) -(void) wjZeroSeparatorInset { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([self respondsToSelector:@selector(setLayoutMargins:)]) { self.layoutMargins = UIEdgeInsetsZero; } #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ([self respondsToSelector: @selector(setSeparatorInset:)]) self.separatorInset = UIEdgeInsetsZero; } #endif } @end 
  3. En UITableViews, poco después de la inicialización, llame

     [self wjZeroSeparatorInset]; 
  4. En UITableViewControllers, necesita lo siguiente:

     -(void) viewWillLayoutSubviews { [super viewWillLayoutSubviews]; UITableView* tv = self.tableView; if ([tv respondsToSelector:@selector(setLayoutMargins:)]) { [tv setLayoutMargins:UIEdgeInsetsZero]; } } 

En iOS 8, parece haber un pequeño error. El valor personalizado para la inserción del separador no se aplica a las celdas con texto. Intenté configurarlo desde el constructor de interfaz y mediante el código, pero ninguno funcionó. He archivado un informe de error también.

enter image description here

Mientras tanto, tengo una pequeña solución para lograr esto. Simplemente dibujo la línea en la celda. Cree una subclase de UITableViewCell y anule el método drawRect . Además, no olvide configurar la propiedad separadora de UITableView en None. Aquí está el código. Está en Swift, pero dado que es básicamente C, también puedes usar lo mismo en Objective-C.

 override func drawRect(rect: CGRect) { super.drawRect(rect) let context = UIGraphicsGetCurrentContext() CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color CGContextSetLineWidth(context, 2) // separator width CGContextMoveToPoint(context, 0, self.bounds.size.height) CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height) CGContextStrokePath(context) } 

Restablecer separaratorInset soluciona este problema para mí:

 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:self.tableView.separatorInset]; } 

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

¡Tenga cuidado al establecer el conjunto separador de TableView en UIEdgeInsetsZero parece romper el margen izquierdo de los títulos de las secciones al mismo tiempo! (al menos lo hace en iOS 7.1)

Si desea visualizar títulos de sección con tableView: titleForHeaderInSection: y aún así obtener el efecto deseado de no salto de línea entre UITableViewCells, debe establecer separatorInset directamente en las celdas en lugar de tableView.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... [cell setSeparatorInset:UIEdgeInsetsZero]; 

Para iOS8 + esto funcionó para mí,

 tableView.layoutMargins = UIEdgeInsetsZero 

y en el método cellForRowAtIndexPath :

 cell.layoutMargins = UIEdgeInsetsZero; 
 - (void)viewDidLoad { [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; [super viewDidLoad]; // Additional setup } 

Nota: la línea setSeparatorStyle debe estar encima de la super llamada.

 @implementation UITableView (HGApperance) -(void)setSeparatorXMargin:(CGFloat)margin{ // iOS 7 if ([self respondsToSelector:@selector(setSeparatorInset:)]) { [self setSeparatorInset:UIEdgeInsetsZero]; } if ([self respondsToSelector:@selector(layoutMargins)]) { self.layoutMargins = UIEdgeInsetsZero; } } @end 

Para TableviewCell, la respuesta de Willam funciona perfectamente.

Para iOS8 y superior

Si encuentra que todas las soluciones no funcionan como yo, creo que puede haber usado la subclase de UITableViewCell y anular el método layoutSubviews , si cumple con dos de las condiciones, continúe leyendo.

Hacer o verificarlo paso a paso.

1, después de alloc e init UITableView , establezca su propiedad layoutMargins .

 if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { _tableView.layoutMargins = UIEdgeInsetsZero ; } 

2, en el método - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , después de alloc e init su UITableViewCell personalizado, configure su propiedad layoutMargins .

 if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { cell.layoutMargins = UIEdgeInsetsZero ; } 

3, la parte más importante entra. Si anula el método - (void)layoutSubviews de UITableViewCell, no olvide llamar a su super .

 - (void)layoutSubviews { [super layoutSubviews] ; // layout the subviews } 

Versión de Xamarin.iOS

Extendí el separador UITableView en todo el ancho en Xamarin.iOS en iOS 8.4 con la ayuda de publicaciones de Luis E. Prado y King-Wizard . Tuve que configurar SeparatorInset y LayoutMargins para que funcione. No escribí cheques para versiones inferiores de iOS, ya que estoy apuntando a iOS 8 y superior.

Escribí los siguientes dos métodos de extensión C # para configurar el ancho completo del separador UITableView en el nivel UITableView o UITableViewCell. Puede usar uno o ambos de estos métodos dependiendo del efecto deseado (consulte las explicaciones a continuación).

UITableView

Establezca las propiedades de UITableView para alterar los separadores que aparecen después de las celdas vacías. Este método SetLayoutMarginsZero podría invocarse desde el método ViewDidLoad ViewController relacionado.

 public static void SetLayoutMarginsZero(this UITableView tableView) { tableView.SeparatorInset = UIEdgeInsets.Zero; tableView.LayoutMargins = UIEdgeInsets.Zero; } 

UITableViewCell

Establezca las propiedades de UITableViewCell para alterar los separadores que aparecen después de las celdas pobladas. Este método SetLayoutMarginsZero podría invocarse desde el método TableViewSource GetCell.

 public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell) { tableViewCell.SeparatorInset = UIEdgeInsets.Zero; tableViewCell.LayoutMargins = UIEdgeInsets.Zero; tableViewCell.PreservesSuperviewLayoutMargins = false; }