Pourquoi separator inset 0 ne fonctionne-t-il pas dans iOS 8 ? Découverte du problème
\n\nImaginez : vous écrivez votre première application pour iPhone, le tableau est parfait sur le simulateur iOS 14, mais lorsque vous testez sur un vieil iPhone 6 avec iOS 8… boum ! Les séparateurs de cellules se comportent de manière imprévisible. Vous définissez separatorInset = .zero, mais les marges de gauche persistent. Une situation familière ?
Ce problème — iOS 8 UITableView separator inset 0 not working — est un véritable « obstacle » pour les développeurs iOS débutants. Sur Stack Overflow, cette question a recueilli des milliers de vues, et ce n’est pas pour rien. Dans cet article, nous ne nous contenterons pas de donner une solution toute faite, mais nous comprendrons pourquoi cela se produit et comment éviter de tels pièges à l’avenir.
\n\nSi vous commencez tout juste à apprendre Swift et UIKit, ne vous inquiétez pas — nous allons parcourir tout le chemin étape par étape. À la fin de l’article, non seulement vous corrigerez le bug, mais vous comprendrez également comment fonctionne UITableView en profondeur.
\n\nLa racine du mal : qu’est-ce que separatorInset et pourquoi iOS 8 l’ignore-t-il ?
\n\nAvant de traiter, il faut comprendre le diagnostic. SeparatorInset est une propriété de UITableViewCell (et du tableau lui-même) qui contrôle les marges de la ligne de séparation entre les cellules. Par défaut, iOS ajoute une petite marge à gauche (15 points) pour que le séparateur ne commence pas tout au bord de l’écran.
Lorsque vous écrivez :
\n\ncell.separatorInset = UIEdgeInsets.zero\n\n…vous vous attendez à ce que la ligne aille d’un bord à l’autre. Mais dans iOS 8 (et les versions antérieures), cela ne se produit pas. Pourquoi ?
\n\n- \n
- Raison 1 : Dans iOS 8, la propriété
separatorInsetsur la cellule ne remplace pas toujours les paramètres globaux du tableau. \n - Raison 2 : Il existe une propriété « magique »
layoutMarginsqui, dans iOS 8, a priorité surseparatorInset. Apple n’a pas documenté ce comportement, et de nombreux développeurs sont tombés dans le piège. \n - Raison 3 : Le système ajoute par défaut des marges via
preservesSuperviewLayoutMargins, qui est toujours activé dans iOS 8. \n
En bref : vous dites à la cellule « mets la marge à 0 », et elle répond « non, j’obéis au tableau et à ses layoutMargins ».
\n\nSolution étape par étape : comment faire fonctionner separator inset dans iOS 8
\n\nVoici une recette éprouvée qui fonctionnait dans iOS 8 et fonctionne encore aujourd’hui. Nous allons agir à trois niveaux : tableau → cellule → layoutMargins.
\n\nÉtape 1. Configuration de UITableView (niveau global)
\n\nLa méthode la plus fiable est de définir les marges pour tout le tableau directement dans viewDidLoad :
override func viewDidLoad() {\n super.viewDidLoad()\n \n // Désactiver les marges supplémentaires du tableau\n tableView.separatorInset = .zero\n tableView.layoutMargins = .zero\n \n // Important pour iOS 8 : empêcher les cellules d’hériter des marges du tableau\n tableView.preservesSuperviewLayoutMargins = false\n}\n\nCes trois lignes constituent votre protection de base. Mais parfois cela ne suffit pas, et il faut ajuster au niveau de la cellule.
\n\nÉtape 2. Configuration de chaque cellule (niveau local)
\n\nDans la méthode cellForRowAt, ajoutez :
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)\n \n // Redéfinir les paramètres de la cellule\n cell.separatorInset = .zero\n cell.layoutMargins = .zero\n cell.preservesSuperviewLayoutMargins = false\n \n // Configuration du contenu\n cell.textLabel?.text = "Ligne \\(indexPath.row)"\n \n return cell\n}\n\nRemarque : nous dupliquons les paramètres. Ce n’est pas une erreur — cela garantit que la cellule remplacera tous les paramètres globaux du tableau.
\n\n