¿Por qué no funciona separator inset 0 en iOS 8? Conociendo el problema
\n\nImagina: estás escribiendo tu primera aplicación para iPhone, la tabla se ve genial en el simulador de iOS 14, pero cuando pruebas en un viejo iPhone 6 con iOS 8… ¡pum! Los separadores de celdas se comportan de manera impredecible. Configuras separatorInset = .zero, pero los márgenes izquierdos siguen ahí. ¿Te suena familiar?
Este problema — iOS 8 UITableView separator inset 0 not working — es un verdadero "punto de conflicto" para los desarrolladores iOS principiantes. En Stack Overflow, esta pregunta ha acumulado miles de visitas, y con razón. En este artículo no solo daremos una solución lista, sino que también entenderemos por qué sucede y cómo evitar trampas similares en el futuro.
\n\nSi apenas estás empezando a aprender Swift y UIKit, no te preocupes — recorreremos todo el camino paso a paso. Al final del artículo, no solo habrás corregido el bug, sino que también comprenderás cómo funciona UITableView a un nivel profundo.
\n\nLa raíz del mal: ¿qué es separatorInset y por qué iOS 8 lo ignora?
\n\nAntes de curar, hay que entender el diagnóstico. SeparatorInset es una propiedad de UITableViewCell (y de la tabla misma) que controla los márgenes de la línea separadora entre celdas. Por defecto, iOS agrega un pequeño margen izquierdo (15 puntos) para que el separador no comience desde el borde mismo de la pantalla.
Cuando escribes:
\n\ncell.separatorInset = UIEdgeInsets.zero\n\n…esperas que la línea vaya de borde a borde. Pero en iOS 8 (y versiones anteriores) esto no sucede. ¿Por qué?
\n\n- \n
- Causa 1: En iOS 8, la propiedad
separatorInseten la celda no siempre anula la configuración global de la tabla. \n - Causa 2: Existe una propiedad "mágica" llamada
layoutMarginsque en iOS 8 tiene prioridad sobreseparatorInset. Apple no documentó este comportamiento, y muchos desarrolladores cayeron en la trampa. \n - Causa 3: El sistema agrega márgenes por defecto a través de
preservesSuperviewLayoutMargins, que en iOS 8 está siempre activado. \n
En resumen: le dices a la celda "pon margen 0", y ella responde "no, obedezco a la tabla y a sus layoutMargins".
\n\nSolución paso a paso: cómo hacer que separator inset funcione en iOS 8
\n\nAquí tienes una receta probada que funcionaba en iOS 8 y sigue funcionando hoy. Actuaremos en tres niveles: tabla → celda → layoutMargins.
\n\nPaso 1. Configuración de UITableView (nivel global)
\n\nLa forma más confiable es establecer los márgenes para toda la tabla de una vez, en viewDidLoad:
override func viewDidLoad() {\n super.viewDidLoad()\n \n // Desactivar márgenes adicionales de la tabla\n tableView.separatorInset = .zero\n tableView.layoutMargins = .zero\n \n // Importante para iOS 8: evitar que las celdas hereden márgenes de la tabla\n tableView.preservesSuperviewLayoutMargins = false\n}\n\nEstas tres líneas son tu protección básica. Pero a veces esto no es suficiente y hay que ajustar a nivel de celda.
\n\nPaso 2. Configuración de cada celda (nivel local)
\n\nEn el método cellForRowAt, agrega:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)\n \n // Sobrescribir la configuración de la celda\n cell.separatorInset = .zero\n cell.layoutMargins = .zero\n cell.preservesSuperviewLayoutMargins = false\n \n // Configuración del contenido\n cell.textLabel?.text = "Fila \\(indexPath.row)"\n \n return cell\n}\n\nObserva: estamos duplicando la configuración. No es un error — así garantizamos que la celda anule cualquier configuración global de la tabla.
\n\n