Cómo establecer el ancho completo del separador en UITableView


149

Tengo un UITableViewdonde los separadores no tienen todo el ancho. Termina como 10 píxeles antes del lado izquierdo. Estaba jugando con este código en el viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

También en el guión gráfico cuando puede seleccionar selectores personalizados o predeterminados. Ahora todas las celdas que están pobladas no tienen los selectores de ancho completo, pero las celdas que están vacías tienen ancho completo.

¿Cómo puedo arreglar esto?


9
UITableViewTiene una propiedad separatorInset. Establezca la inserción del UITableViewseparador de línea en cero. También puede cambiar el separatorInsetdesde el guión gráfico
KRUKUSA

Respuestas:


220

Esto funcionó para mí en dispositivos iOS 8.4 - 9.0 que usan Xcode 6.4 y Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Actualización de Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

¿Por qué esto elimina mi tabla con una en blanco? Los separadores se mueven pero no puedo ver ninguno de mis botones
Oscar

1
@ James, ¿podría explicar "eliminar mi mesa con una en blanco"? ¿Cómo ha agregado sus botones (a través de IB, código)?
MB_iOSDeveloper

1
Muy buena solución. Pero en mi caso puse el código directamente en la inicialización de la celda, porque quería tener el ancho completo del separador en todos los controladores.
Vojta

En caso de que no sea obvio, esto también funciona para Objective-C con los cambios de sintaxis adecuados, por supuesto.
cohenadair

1
Ninguna de estas soluciones funciona en un iPad. Esto solo funciona en un iPhone ...
Charles Robertson

103

Recibí la respuesta de esta publicación: el separador 0 del separador UITableView de iOS 8 no funciona

Simplemente agregue este código en su UITableViewController

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

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

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

2
me funciona para agregar solo el método delegado
tableView

Lo siento, no entendí. ¿Quiere decir que fue suficiente para agregar TableViewDeleagte? Solo intenté agregar que no funcionó para mí @TonyTony
Timo Cengiz el

3
para mí el método viewDidLayoutSubviewsno es necesario
TonyTony

¿Intentó ejecutar su código con otras versiones de iOS que no sean la 8? Tal vez funcione para los más nuevos. De lo contrario, es bueno para ti que funcione. Intenté simplemente agregar el método delegado de vista de tabla y no me ayudó. @TonyTony
Timo Cengiz

Tuve que usar ambos. Intenté usar cada uno individualmente sin éxito. Solo funcionó cuando usé ambos. Además, lo probé cuando mi controlador de vista era una subclase de UITableViewController, y cuando era una subclase de UIViewController. Ninguna diferencia. Tenga en cuenta que estoy corriendo en el simulador 8.1.
Ron

100

En tus UITableViewCell

Vaya al Inspector de atributos en el Creador de interfaces y simplemente cambie "15" a 0. Haga esto para todas las celdas que desea cambiar.

empeine

Es posible que deba agregar [cell setLayoutMargins:UIEdgeInsetsZero];a sutableViewCell


1
O eso es raro. Esto funcionó para mí (¡gracias!) En las filas donde tenía que mostrar UITableViewCells, pero en las filas vacías debajo de ellas, el separador todavía estaba sangrado por 15 píxeles.
Mike Gledhill

Si está utilizando celdas estáticas, todo lo que necesita es cambiar el recuadro izquierdo a 0 como se describe en la imagen (Trabajando en iOS 10, Xcode 8.3.1)
Ignacio Valdivieso

29

para Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. Selecciona tu UITableViewCell
  2. Ir al inspector de atributos
  3. Vaya a Separador y cámbielo a "Inserciones personalizadas"
  4. Conjunto lefty / o rightcampos. (Por defecto left: 15, right: 0)

Mira cómo funciona (usando left: 100):

ingrese la descripción de la imagen aquí

Resultado:

ingrese la descripción de la imagen aquí


1
duplicado de la respuesta anterior de @Hannah Louisa Carney
Konstantin Salavatov

19

Heredo de UITableViewControllery necesitaba adicional a la configuración de dos inserciones en willDisplayCelltambién para establecer preservesSuperviewLayoutMarginsen falso. En Swift se ve así:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

No es necesario configurarlo preservesSuperviewLayoutMargins = falseporque el valor predeterminado ya es falso
crubio

2
Tenga en cuenta que esto no ajustará los separadores en las celdas de 'marcador de posición' que muestra el controlador para llenar la vista debajo de las celdas si las celdas no ocupan la altura completa.
Tieme

11

El separador Insetes por defecto 15 desde la izquierda. Cambie la Insetopción Separador de autoa customy establezca el recuadro en 0.

ingrese la descripción de la imagen aquí


9

Para Swift en iOS 9+

Si usa una costumbre UITableViewCell:

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

entonces para tu UITableViewen viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

Esta es la única respuesta que me lo arregló (actualizado a Swift 3). Sin embargo ... funciona cuando hay datos en la celda. Para las celdas en blanco que aún no se han llenado (y supongo que no han llamado a esta variable de diseño de márgenes anulada), el separador todavía no llena el ancho completo de mi celda personalizada en la vista de tabla. ¿Alguna idea sobre eso?
RanLearns

En el iPhone, el separador termina solo unos pocos píxeles desde la izquierda y unos pocos píxeles desde la derecha en las celdas vacías. Eso se ve bien sin usar este truco para poner a cero los márgenes. En el iPad, el verdadero problema es que los separadores en una celda vacía van desde el borde izquierdo de la vista de tabla, solo alrededor del 80% del ancho de la celda. Cuando hay datos en la celda, el separador sigue siendo el 80% del ancho de la celda, pero comienza el 20% del camino y llega hasta el borde derecho de la vista de tabla
RanLearns

1
Descubrí una solución ... usando if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} lo hizo para que no necesite tu código en iPhone. El separador solo va todo el ancho. En iPad, las celdas vacías tienen un separador de ancho completo, pero necesito su código para mantener el ancho completo cuando se agregan datos. De lo contrario, hay unos pocos píxeles a la izquierda agregados donde no hay separador una vez que los datos llenan la celda.
RanLearns

1
Responda de dónde obtuve el código en el comentario anterior de: stackoverflow.com/a/31538250/428981
RanLearns

9

Para las personas que tienen problemas con el iPad, esto lo llevará a un estado similar al del iPhone. A continuación, puede ajustarlo separatorInsetsegún sea necesario.

tableView.cellLayoutMarginsFollowReadableWidth = false

Este fue mi problema en iOS 10 vs iOS 11. iOS 11 estaba bien, pero 10 tenía márgenes diferentes. ¡¡¡Gracias!!!
migs647

9

Úselo en el cellForRowAtIndexPathmétodo, para configurar las especificaciones del separador de la celda,
funciona perfecto para iOS9.0 +

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

8

Probado para iOS 9.3 y Swift 2.2. Asegúrese de poner el código en el willDisplayCellque se llama justo antes de mostrar la celda y no encellForRowAtIndexPath donde crea la celda solamente.

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

Agregue overridea la función para UITableViewController, así:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

Nada de lo anterior funcionó para mí en Swift 2.2 y Xcode 7.3.1

Resultó ser la solución más simple de todas. No se necesita código. Simplemente cambie los TableViewCellvalores de Márgenes de diseño en su UITableViewinspector:


4

Para Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

En viewDidLoad(probado iOS11 - swift 4.1)

tratar

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

Ninguna de estas soluciones funciona en el iPad, pero se me ocurrió una solución que cubre ambos dispositivos:

Con celdas reutilizables:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Con celdas no reutilizables:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Solo para ampliar este enfoque:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Ambas propiedades pueden ser utilizadas por UITableView& UITableViewCell. Este último es, de hecho, una propiedad de UIView, que es una clase padre de ambos UITableView& UITableViewCell.


1
La única solución viable que encontré para las células no reutilizables
Mickey,

0

Swift 5, actualización Xcode 11

coloque esto dentro de viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

para el separador de borde a borde solo establezca el valor de izquierda y derecha en 0.

por cierto, cambie "yourTableView" a su nombre de Outlet tableView.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.