UIScrollView ne défile pas

J’ai un UIScrollView qui contient beaucoup de UIImageView , UILabels, etc … les étiquettes sont beaucoup plus longues que UIScrollView , mais quand je lance l’application, je ne peux pas cliquer et faire défiler vers le bas …

Pourquoi cela pourrait-il être?

Merci

Il est toujours bon d’afficher un extrait de code de travail complet:

 // in viewDidLoad (if using Autolayout check note below): UIScrollView *myScrollView; UIView *contentView; // scrollview won't scroll unless content size explicitly set [myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size 

Swift 4.0

 let myScrollView let contentView // scrollview won't scroll unless content size explicitly set myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc myScrollView.contentSize = contentView.frame.size //sets ScrollView content size 

Je n’ai pas trouvé de moyen de définir contentSize dans IB (à partir de Xcode 5.0) .

Remarque: Si vous utilisez Autolayout, le meilleur endroit pour placer ce code est la méthode -(void)viewDidLayoutSubviews .

Si vous ne pouvez pas faire défiler la vue même après avoir correctement défini contentSize , assurez-vous de désélectionner “Utiliser la mise en forme automatique” dans Interface Builder -> Inspecteur de fichiers.

Vous devez définir la propriété contentSize de la vue de défilement pour qu’elle défile correctement.

Si vous utilisez autolayout, vous devez définir contentSize dans viewDidLayoutSubviews pour pouvoir l’appliquer à la fin de l’autolayout.

Le code pourrait ressembler à ceci:

 -(void)viewDidLayoutSubviews { // The scrollview needs to know the content size for it to work correctly self.scrollView.contentSize = CGSizeMake( self.scrollContent.frame.size.width, self.scrollContent.frame.size.height + 300 ); } 

La réponse ci-dessus est correcte – pour que le défilement puisse avoir lieu, il est nécessaire de définir la taille du contenu.

Si vous utilisez le générateur d’interface, vous pouvez utiliser cette méthode avec les atsortingbuts d’exécution définis par l’utilisateur. Par exemple:

entrer la description de l'image ici

Essayez de redimensionner la taille du contenu en nombres énormes. Je ne comprenais pas pourquoi ma vue de défilement ne défilait pas même si la taille de son contenu semblait être plus grande que la taille du contrôle. J’ai découvert que si la taille du contenu est plus petite que nécessaire, cela ne fonctionne pas aussi.

 self.scrollView.contentSize = CGSizeMake(2000, 2000); 

Au lieu de 2000, vous pouvez mettre vos propres gros chiffres. Et si cela fonctionne, cela signifie que la taille de votre contenu n’est pas assez grande lorsque vous redimensionnez.

Le délégué n’est pas nécessaire pour que la vue défilement fonctionne.

Assurez-vous que la propriété contentSize de la vue de défilement est définie sur la taille correcte (c.-à-d. Une taille suffisante pour englober tout votre contenu).

Désélectionnez “Utiliser Autolayout” pour moi.

Environnement: xCode 5.0.2 Storyboards ios7

Dans mon cas, je devais définir delaysContentTouches à true car les objects à l’intérieur de scrollView capturaient tous les événements tactiles et les manipulaient eux-mêmes plutôt que de laisser le scrollView lui-même le gérer.

L’idée de la raison pour laquelle la vue de défilement ne défile pas, car vous définissez la taille du contenu pour le défilement inférieur à la taille de la vue de défilement, ce qui est faux. Vous devez définir la taille du contenu plus grande que la taille de votre vue de défilement pour naviguer à travers le défilement.

La même idée avec le zoom, vous définissez les valeurs min et max pour le zoom qui seront appliquées par le biais d’une action de zoom.

Bienvenue 🙂

Un petit ajout, tout ce qui précède sont les raisons réelles pour lesquelles votre défilement peut ne pas défiler, mais parfois cela peut être la raison en particulier lorsque scrollview est ajouté par le code et non par IB, vous pouvez avoir ajouté les sous-vues à la vue parent la défilement qui fait défiler la sous-vue

et garder la taille du contenu définie et plus grande que le cadre de la vue parent (duhh !!)

Définissez la propriété contentSize de UIScrollview dans la méthode ViewDidLayoutSubviews . Quelque chose comme ça

 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height) } 

Si vous recevez un message (IOS8 / swift) viewDidLayoutSubviews que viewDidLayoutSubviews n’existe pas, utilisez plutôt ce qui suit

 override func viewDidAppear(animated: Bool) 

Cela a corrigé pour moi

Quelque chose qui n’a pas été mentionné auparavant!

Assurez-vous que votre prise était correctement connectée à scrollView! Il devrait y avoir un cercle rempli, mais même si vous avez rempli un cercle, scrollView peut ne pas être connecté – vérifiez donc deux fois! Survolez le cercle et voyez si la scrollview actuelle est mise en évidence! (C’était un cas pour moi)

 //Connect below well to the scrollView in the storyBoard @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 

Bien souvent, le code est correct si vous avez suivi un didacticiel, mais ce que de nombreux débutants ignorent, c’est que scrollView ne va PAS défiler normalement dans le simulateur. Il est supposé faire défiler uniquement lorsque vous appuyez sur le tapis de souris et faites défiler simultanément. Beaucoup d’utilisateurs expérimentés de XCode / Swift / Obj-C sont tellement habitués à le faire, et ne savent donc pas comment les débutants pourraient l’ignorer. Ciao 🙂

 @IBOutlet weak var scrollView: UIScrollView! override func viewDidLoad() { super.viewDidLoad() view.addSubview(scrollView) // Do any additional setup after the view } override func viewWillLayoutSubviews(){ super.viewWillLayoutSubviews() scrollView.contentSize = CGSize(width: 375, height: 800) } 

Ce code fonctionnera parfaitement si vous faites ce que j’ai dit ci-dessus

Si aucune des autres solutions ne fonctionne pour vous, vérifiez que votre vue de défilement est bien une UIScrollView dans Interface Builder.

À un moment donné au cours des derniers jours, mon UIScrollView changé spontanément de type UIView , même si sa classe indiquait UIScrollView dans l’inspecteur. J’utilise Xcode 5.1 (5B130a) .

Vous pouvez créer une nouvelle vue de défilement et copier les mesures, les parameters et les contraintes de l’ancienne vue ou modifier manuellement votre vue en UIScrollView dans le fichier xib . J’ai fait une comparaison et trouvé les différences suivantes:

Original:

  ...  

Après type spontanément changé:

  ...  

J’ai donc remplacé la ligne ligne originale.

J’ai également remplacé la balise fermée de la vue par .

Veillez à conserver le même identifiant que la vue actuelle, dans ce cas: id = “qRn-TP-cXd”.

J’ai également dû vider le xib du cache de Xcode en supprimant les données dérivées de l’application:

  • Xcode->Window->Organizer->Projects , choisissez votre projet, sur la ligne de données dérivées, cliquez sur Delete …

Ou si vous utilisez un appareil:

  • Xcode->Window->Organizer->Device , choisissez votre appareil-> Applications, choisissez votre application, cliquez sur (-)

Maintenant, nettoyez le projet et supprimez l’application du simulateur / périphérique:

  • Xcode->Product->Clean
  • iOS Simulator/device->press et maintenez l’ app->click le (X) pour le supprimer

Vous devriez alors pouvoir créer et exécuter votre application et disposer à nouveau d’une fonctionnalité de défilement.

PS Je n’ai pas eu à définir la taille du contenu de la vue de défilement dans viewDidLayoutSubviews ou désactiver la mise en page automatique, mais YMMV.

Si votre scrollView est une sous-vue d’un containerView d’un certain type, assurez-vous que votre scrollView trouve dans le cadre ou les limites du containerView . J’ai eu containerView.clipsToBounds = NO qui me permettait toujours de voir le scrollView, mais parce que scrollView n’était pas dans les limites de containerView il ne détectait pas les événements tactiles.

Par exemple:

 containerView.frame = CGRectMake(0, 0, 200, 200); scrollView.frame = CGRectMake(0, 200, 200, 200); [containerView addSubview:scrollView]; scrollView.userInteractionEnabled = YES; 

Vous serez en mesure de voir le scrollView mais il ne recevra pas d’interactions utilisateur.

l’ajout du code suivant dans viewDidLayoutSubviews fonctionné pour moi avec Autolayout. Après avoir essayé toutes les réponses:

 - (void)viewDidLayoutSubviews { self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620); } //set the height of content size as required 

Ajoutez le UIScrollViewDelegate et en ajoutant le code suivant à la méthode viewDidAppear , viewDidAppear le pour moi.

 @interface testScrollViewController ()  -(void)viewDidAppear:(BOOL)animated { self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; self.scrollView.contentSize = CGSizeMake(375, 800); } 

Après avoir échoué avec les réponses fournies dans ce fil, je suis tombé sur cet article avec la solution.

Il y a deux choses qui ne sont pas intuitives dans la configuration de la vue de défilement avec autolayout:

  1. Les contraintes que vous définissez en tant que marge entre contentview et scrollview n’influencent pas la taille de contentview. Ce sont vraiment des marges. Et pour que cela fonctionne, la contentview doit avoir une taille fixe.
  2. L’astuce de la taille fixe est que vous pouvez définir la largeur de contentview égale à celle du parent de scrollview. Il suffit de sélectionner les deux vues dans l’arborescence à gauche et d’append la contrainte de largeur égale.

C’est l’essentiel de cet article. Pour une explication complète, y compris les illustrations, vérifiez-la.

Je l’ai fait travailler à mon premier essai. Avec mise en page automatique et tout, pas de code supplémentaire. Ensuite, une vue de collection est devenue banane, se brisant à l’exécution, je ne pouvais pas trouver ce qui n’allait pas, alors j’ai supprimé et recréé (j’utilise Xcode 10 Beta 4. C’était un bug) et le défilement a disparu. La vue Collection a fonctionné à nouveau, cependant!

Plusieurs heures plus tard .. c’est ce qui a été corrigé pour moi. J’avais la disposition suivante:

UIView

  • Zone protégée
  • Vue de défilement
    • Affichage du contenu

Tout est dans les contraintes. La zone de sécurité est automatiquement définie par le système. Dans le pire des cas, supprimez toutes les contraintes pour les affichages de défilement et de contenu et ne les réinitialisez / créez pas pour vous. Faites-les manuellement, ça marche.

  • Pour la vue de défilement, j’ai fait: Aligner la piste / en haut sur la zone sécurisée. Largeur / Hauteur égale à la zone de sécurité .
  • Pour l’affichage du contenu, j’ai fait: Aligner Trailing / Leading / Top / Bottom sur Superview (la vue de défilement)

fondamentalement, le concept consiste à afficher la vue du contenu dans la vue de défilement, ce qui convient à la zone de sécurité.

Mais en tant que tel, cela n’a pas fonctionné. La vue du contenu a manqué la hauteur. J’ai essayé tout ce que je pouvais et le seul à faire le tour a été une hauteur de vue de contenu créée par contrôle-glissement de la vue du contenu .. à elle-même . Cela a défini une hauteur fixe, quelle valeur a été calculée à partir de la taille du contrôleur de vue (définie comme forme libre, plus longue que l’affichage réel, pour contenir toutes mes sous-vues) et finalement, cela a fonctionné à nouveau!

J’ai trouvé cela avec ce problème de mise en forme automatique … si je fais juste que le ViewController utilise UIView au lieu de UIScrollView pour la classe … alors il suffit d’append un UIScrollView moi-même … qu’il fonctionne.