Por que o separator inset 0 não funciona no iOS 8? Conhecendo o problema
\n\nImagine: você está escrevendo seu primeiro aplicativo para iPhone, a tabela parece ótima no simulador do iOS 14, mas quando você testa em um iPhone 6 antigo com iOS 8… puf! Os separadores de células (separators) se comportam de forma imprevisível. Você define separatorInset = .zero, mas as margens esquerdas ainda permanecem. Situação familiar?
Esse problema — iOS 8 UITableView separator inset 0 not working — é uma verdadeira "pedra no sapato" para desenvolvedores iOS iniciantes. No Stack Overflow, essa pergunta acumulou milhares de visualizações, e não é à toa. Neste artigo, não vamos apenas dar uma solução pronta, mas também entender por que isso acontece e como evitar armadilhas semelhantes no futuro.
\n\nSe você está começando a aprender Swift e UIKit, não se preocupe — vamos percorrer todo o caminho passo a passo. Ao final do artigo, você não apenas corrigirá o bug, mas também entenderá como o UITableView funciona em um nível profundo.
\n\nA raiz do mal: o que é separatorInset e por que o iOS 8 o ignora?
\n\nAntes de tratar, precisamos entender o diagnóstico. SeparatorInset é uma propriedade de UITableViewCell (e da própria tabela) que controla as margens da linha separadora entre as células. Por padrão, o iOS adiciona uma pequena margem esquerda (15 pontos) para que o separador não comece na borda da tela.
Quando você escreve:
\n\ncell.separatorInset = UIEdgeInsets.zero\n\n…você espera que a linha vá de ponta a ponta. Mas no iOS 8 (e versões anteriores) isso não acontece. Por quê?
\n\n- \n
- Causa 1: No iOS 8, a propriedade
separatorInsetna célula nem sempre substitui as configurações globais da tabela. \n - Causa 2: Existe uma propriedade "mágica" chamada
layoutMarginsque, no iOS 8, tem prioridade sobreseparatorInset. A Apple não documentou esse comportamento, e muitos desenvolvedores caíram nessa. \n - Causa 3: O sistema adiciona margens por padrão através de
preservesSuperviewLayoutMargins, que no iOS 8 está sempre ativado. \n
Resumindo: você diz à célula "faça a margem 0", e ela responde "não, eu obedeço à tabela e seus layoutMargins".
\n\nSolução passo a passo: como fazer o separator inset funcionar no iOS 8
\n\nAqui está uma receita comprovada que funcionava no iOS 8 e ainda funciona. Vamos atuar em três níveis: tabela → célula → layoutMargins.
\n\nPasso 1. Configuração da UITableView (nível global)
\n\nA maneira mais confiável é definir as margens para toda a tabela de uma vez, no viewDidLoad:
override func viewDidLoad() {\n super.viewDidLoad()\n \n // Desativa margens extras da tabela\n tableView.separatorInset = .zero\n tableView.layoutMargins = .zero\n \n // Importante para iOS 8: impede que as células herdem margens da tabela\n tableView.preservesSuperviewLayoutMargins = false\n}\n\nEssas três linhas são sua proteção básica. Mas às vezes isso não é suficiente, e é preciso ajustar no nível da célula.
\n\nPasso 2. Configuração de cada célula (nível local)
\n\nNo método cellForRowAt, adicione:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)\n \n // Substitui as configurações da célula\n cell.separatorInset = .zero\n cell.layoutMargins = .zero\n cell.preservesSuperviewLayoutMargins = false\n \n // Configuração do conteúdo\n cell.textLabel?.text = "Linha \\(indexPath.row)"\n \n return cell\n}\n\nObserve: estamos duplicando as configurações. Isso não é um erro — assim garantimos que a célula substituirá quaisquer configurações globais da tabela.
\n\n