iOS 8 UITableView separator inset 0 not working : guide complet pour les débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi separator inset 0 ne fonctionne-t-il pas dans iOS 8 ? Découverte du problème

\n\n

Imaginez : 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 ?

\n\n

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\n

Si 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\n

La racine du mal : qu’est-ce que separatorInset et pourquoi iOS 8 l’ignore-t-il ?

\n\n

Avant 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.

\n\n

Lorsque vous écrivez :

\n\n
cell.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é separatorInset sur la cellule ne remplace pas toujours les paramètres globaux du tableau.
  • \n
  • Raison 2 : Il existe une propriété « magique » layoutMargins qui, dans iOS 8, a priorité sur separatorInset. 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
\n\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\n

Solution étape par étape : comment faire fonctionner separator inset dans iOS 8

\n\n

Voici 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\n

La méthode la plus fiable est de définir les marges pour tout le tableau directement dans viewDidLoad :

\n\n
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\n

Ces 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\n

Dans la méthode cellForRowAt, ajoutez :

\n\n
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\n

Remarque : 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

Étape 3. (Optionnel)

Blogs

Book Recommendations