Ambiguïté de la taille du contenu UIScrollView : comment la corriger en 10 minutes

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

Introduction : La "magie" de UIScrollView qui cesse de fonctionner



Avez-vous déjà été confronté à cette situation : vous ajoutez un UIScrollView à votre projet Swift, configurez Auto Layout, lancez l'application — et rien ne défile ? Ou pire encore, Xcode affiche une erreur mystérieuse : "UIScrollView scrollable content size ambiguity" ? Si oui, vous n'êtes pas seul. Cette question a recueilli des milliers de vues sur Stack Overflow, et aujourd'hui nous allons une fois pour toutes comprendre de quoi il retourne.



Imaginez : vous créez un écran avec un long formulaire d'inscription ou un article qui ne tient pas sur un seul écran. Vous ajoutez un UIScrollView, y placez tous les éléments, définissez les contraintes — et... rien. Le défilement ne fonctionne pas. Cela vous dit quelque chose ? Bienvenue au club des développeurs qui ont maudit Auto Layout pour son "manque de compréhension".



En réalité, le problème de Content Size Ambiguity n'est pas un bug d'iOS, mais un piège logique. Le système ne sait tout simplement pas quelle doit être la taille de votre contenu. Dans ce tutoriel, nous analyserons la cause, trois méthodes de résolution et écrirons du code fonctionnel réel. C'est parti !



Qu'est-ce que Content Size Ambiguity et pourquoi apparaît-elle ?



UIScrollView est un cas particulier dans l'univers d'UIKit. Contrairement aux vues classiques, il ne détermine pas sa taille en fonction des contraintes de ses éléments enfants. Au lieu de cela, il utilise la propriété contentSize (type CGSize), qui indique la taille de la zone de contenu "sous le capot". Si contentSize est inférieur ou égal à la taille du UIScrollView lui-même, le défilement... n'est tout simplement pas nécessaire.



L'erreur Scrollable Content Size Ambiguity se produit lorsque Auto Layout ne peut pas calculer de manière univoque le contentSize à partir des contraintes à l'intérieur de la scroll view. Scénarios typiques :



  • Vous n'avez pas défini de contraintes pour la hauteur ou la largeur du contenu interne.
  • Les contraintes sont "flottantes" (par exemple, aucun lien avec le haut et le bas de la scroll view).
  • Vous utilisez un UIStackView à l'intérieur d'un UIScrollView, mais vous n'avez pas configuré ses dimensions.
  • Vous avez oublié que UIScrollView nécessite une chaîne complète de contraintes d'un bord à l'autre.


Dans la console Xcode, vous verrez quelque chose comme :

Unable to simultaneously satisfy constraints.Will attempt to recover by breaking constraint....UIScrollView scrollable content size ambiguity


Cela semble effrayant, mais la solution est simple. Écrivons le code.



Étape 1 : Créer un projet et ajouter UIScrollView



Ouvrez Xcode, créez un nouveau projet avec le modèle App (iOS, Swift). Nommons-le, par exemple, ScrollFixDemo. Allez dans ViewController.swift et remplacez tout le code par ce qui suit :



import UIKit

class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupScrollView() } private func setupScrollView() { // 1. Créer UIScrollView let scrollView = UIScrollView() scrollView.translatesAutoresizingMaskIntoConstraints = false scrollView.backgroundColor = .systemGray6 view.addSubview(scrollView) // 2. Contraintes pour scrollView (remplir tout l'écran) NSLayoutConstraint.activate([ scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ]) // 3. Créer contentView - conteneur pour tout le contenu let contentView = UIView() contentView.translatesAutoresizingMaskIntoConstraints = false contentView.backgroundColor = .white

Blogs

Book Recommendations