Me di cuenta de que en iOS 7, UITableViewCells tienen un salto de línea en el separador de la celda que iOS 6 no tiene. Hay una manera de deshacerse de este salto de línea? Cambiar el separador a ninguno y, a continuación, hacer UIViews con el color del separador todavía hace que el blanco separador a ocurrir independientemente.

OriginalEl autor Anthony Glyadchenko | 2013-08-21

17 Comentarios

  1. 116

    Para iOS7:

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

    Para iOS8:

    Primer configurar la vista de la tabla de la siguiente manera:

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

    A continuación, en su cellForRowAtIndexPath: método, configurar el celular como sigue:

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

    Nota: Incluye tanto layoutMargins y separatorInset, para apoyar tanto a las versiones de iOS

    Esto funcionaba en iOS 7, pero no parecen funcionar en iOS 8.
    ty por la actualización de respuesta
    El recomendado iOS8 solución no funciona para mí en iOS8.
    Actualización: El iOS 8 fix funciona si se establece layoutMargins en viewDidLayoutSubviews. No funciona si se establece en viewDidLoad o similar. He editado la respuesta para esto es clara.
    Funciona muy bien para mí en viewDidLoad…

    OriginalEl autor Luis E. Prado

  2. 44

    También puede establecer el ‘Separador de Inserción‘ del storyboard:

    Es allí una manera de hacer UITableView células en iOS 7 no tiene un salto de línea en el separador?

    Es allí una manera de hacer UITableView células en iOS 7 no tiene un salto de línea en el separador?

    Para aquellos que tienen un UITableView dentro de una UIView o UIViewController de los padres, no se ve la imagen de arriba, pero vas a ver el «Separador de Márgenes» se establece en «Default» si usted inspeccionar el UITableView el interior .xib. Seleccione «Custom» y cambiar a la izquierda o a la derecha de 0. En otras palabras, no pierdas tu tiempo tratando de todas estas otras cosas! Establecer los márgenes a través de IB..
    Esto suena bien, pero no funciona para mí. He creado un nuevo proyecto, arrastrado en una TVC, el hecho de que la raíz de VC, y se cambió a la izquierda del recuadro a 0. Me encontré con el simulador, y los separadores todavía estaban en el recuadro. Alguna idea de por qué? nobre de la solución (continuación) no funciona para mí.
    Gracias! Me has salvado de mucho tiempo.

    OriginalEl autor null

  3. 37

    Si quieres apoyar a las versiones anteriores de iOS, usted debe comprobar la disponibilidad de este método antes de llamar:

    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    
    Esto es más seguro, si no se dirigen a ios6 así
    ¿Cómo puedo conseguir esto en iOS6?

    OriginalEl autor boro

  4. 16

    Imaginé.

    [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    
    Esto funcionó para mí. No entiendo, por cierto, ¿por qué separador de conseguir los descansos. Y en mi aplicación en una vista de tabla misma línea de separación son dobles y las otras son de una sola. Por qué no tenemos ni idea.
    funcionó para mí en blanco en la vista tabla. pero mi costumbre reutilizables de células separadores se mantuvo como el deafault

    OriginalEl autor Anthony Glyadchenko

  5. 9

    La respuesta seleccionada no me funciona. Pero este sí y se trabaja a partir de ios 2.0:

       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    
    Bueno sólo si usted quiere que sin separador de todos.
    No, eso es si quieres ningún estilo en todo y eso es lo que él quiere.
    Que no responde a la pregunta.

    OriginalEl autor anasaitali

  6. 9

    Swift versión

    iOS introduce la layoutMargins de propiedad sobre las células Y las vistas de tabla.

    Esta propiedad no está disponible en iOS 7.0 por lo que necesita para asegurarse de que usted compruebe antes de asignarlo!

    Sin embargo, Apple ha añadido una **la propiedad de la célula que va a evitar que se hereden su Tabla de Vista de la configuración de los márgenes. De esta manera, las células pueden configurar sus propios márgenes de forma independiente de la vista de tabla. Piense en ello como un reemplazo.

    Esta propiedad se llama preservesSuperviewLayoutMargins, y lo que NO puede permitir que usted para anular su Tabla en la Vista layoutMargin la configuración con su propia célula layoutMargin configuración. Tanto ahorra tiempo (usted no tiene que modificar la Tabla de configuración de Vista), y es más concisa. Por favor refiérase a Mike Abdullah de respuesta para una explicación detallada.

    NOTA: este es el correcto, menos sucio de implementación, tal como se expresa en Mike Abdullah de respuesta; la configuración de tu celda preservesSuperviewLayoutMargins=NO se asegurará de que su Vista Tabla no reemplaza a la celda de configuración.

    Primer paso a la Instalación de sus márgenes de 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
        }
    }
    

    Configuración de la preservesSuperviewLayoutMargins propiedad en su celda para NO debe evitar que su vista de tabla de manipular sus márgenes de celda. En algunos casos, parece no funcionar correctamente.

    Segundo paso – Sólo si todo falla, usted puede usar fuerza bruta en la Tabla de la Vista de los márgenes:

    /*
        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 hay que ir! Esto debería funcionar en iOS 8 y iOS 7.

    Nota: probado con iOS 8.1 y 7.1, en mi caso sólo tuve que utilizar El Primer Paso de esta explicación.

    El Segundo Paso sólo es necesario si usted tiene despoblada celda debajo de la representación de las células, es decir,. si la tabla es mayor que el número de filas en la tabla modelo. No hacer el segundo paso sería el resultado en diferentes separador de compensaciones.

    Perfecto!, gracias

    OriginalEl autor King-Wizard

  7. 8

    Para una solución permanente app-de ancho, llamada de esta aplicación:didFinishLaunching .. cualquier formato tableview se «fija»

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

    OriginalEl autor nobre

  8. 7

    Y en iOS 8, basado en el de Seth McFarlane post aquí, usted necesita para comenzar a tratar con layoutMargins. Lo siguiente que hizo por mí:

    1. En ApplicationDidFinishLaunching, ejecute el siguiente:

      if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) {
          [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero];
      }
      
    2. Crear 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 su UITableViews, poco después de la inicialización, llamada

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

      -(void) viewWillLayoutSubviews {
        [super viewWillLayoutSubviews];
        UITableView* tv = self.tableView;
        if ([tv respondsToSelector:@selector(setLayoutMargins:)]) {
          [tv setLayoutMargins:UIEdgeInsetsZero];
        }
      }
      
    +1 para el uso de la categoría.

    OriginalEl autor William Jockusch

  9. 6

    En iOS 8, no parece ser un pequeño bug. El valor personalizado para el separador de inserción no se aplican a las celdas con texto en ella. Traté de configuración de la interface builder y a través de código, pero tampoco funcionó. He presentado un informe de error así.

    Es allí una manera de hacer UITableView células en iOS 7 no tiene un salto de línea en el separador?

    Mientras tanto, tengo una pequeña solución para lograr esto. Me basta con dibujar la línea en la celda. Crear una subclase de UITableViewCell y anular el drawRect método. También no olvides poner el separador de la propiedad de la UITableView a Ninguno. Aquí está el código. Es rápido, pero desde su básicamente, C, puede utilizar la misma cosa en Objective-C también.

    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)
    }
    
    Gracias. CGContextSetLineWidth(context, 1) está más cerca de defecto, en caso de que alguien quiera más «vainilla» buscar

    OriginalEl autor Isuru

  10. 4

    Restablecer separatorInset corrige este problema para mí:

    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:self.tableView.separatorInset];
    }
    
    Esto es más seguro, si no se dirigen a ios6 así.

    OriginalEl autor user2088250

  11. 3

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

    OriginalEl autor Tea

  12. 2

    Cuidado ya que la configuración de la separatorInset de formato tableview a UIEdgeInsetsZero parece romper el margen izquierdo de la sección de títulos en el mismo tiempo! (al menos no en iOS 7.1)

    Si desea mostrar los títulos de la sección con formato tableview:titleForHeaderInSection: y aún así obtener el efecto deseado de ningún salto de línea entre UITableViewCells, debe establecer la separatorInset directamente en las células, en lugar del formato tableview!

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

    OriginalEl autor Bluezen

  13. 1

    Para iOS8+ esto funcionó para mí,

    tableView.layoutMargins = UIEdgeInsetsZero
    

    y en cellForRowAtIndexPath método:

    cell.layoutMargins = UIEdgeInsetsZero;
    

    OriginalEl autor Zaid Pathan

  14. 0
    - (void)viewDidLoad
    {
        [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    
        [super viewDidLoad];
    
        //Additional setup
    }
    

    Nota: el setSeparatorStyle línea tiene que estar por encima de la súper llamada.

    Que no responde a la pregunta.

    OriginalEl autor Matt Rundle

  15. 0
    @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, Willam del respuesta funciona perfecto.

    OriginalEl autor HamGuy

  16. 0

    A iOS8 y por encima de

    Si usted encuentra que todas las soluciones no funcionan como yo, creo que se podría haber usado la subclase de UITableViewCell y anular el layoutSubviews método, si se cumplen dos condiciones, sigue leyendo.

    Hacer o comprobar paso a paso.

    1、Después de la asignación y el init UITableView, establecer su layoutMargins propiedad.

    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 personalizado UITableViewCell, establecer su layoutMargins de la propiedad.

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

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

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

    OriginalEl autor KudoCC

  17. 0

    Xamarin.la Versión de iOS

    Me extendió la UITableView separador de todo el ancho de Xamarin.iOS en iOS 8.4 con la ayuda de los postes por Luis E. Prado y Rey-Asistente de. Tuve que configurar tanto SeparatorInset y LayoutMargins para que funcione. Yo no se escribir cheques para bajar las versiones de iOS ya que yo soy la orientación de iOS 8 y superior.

    Escribí las siguientes dos C# los métodos de extensión para establecer el UITableView separador de ancho completo en la UITableView o UITableViewCell nivel. Usted puede utilizar uno o ambos de estos métodos en función del efecto deseado (vea las explicaciones a continuación).

    UITableView

    Conjunto de la UITableView propiedades para modificar los separadores que aparecen después de las celdas vacías. Este SetLayoutMarginsZero método podría ser llamado de la relacionada con la ViewController del método ViewDidLoad.

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

    UITableViewCell

    Conjunto de la UITableViewCell propiedades para modificar los separadores que aparecen después de celdas ocupadas. Este SetLayoutMarginsZero método podría ser llamado desde el TableViewSource GetCell método.

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

    OriginalEl autor Mobile Dan

Dejar respuesta

Please enter your comment!
Please enter your name here