UIScrollView pas de défilement
J'ai un UIScrollView
, qui contient de nombreuses UIImageView
s, UILabels, etc... les étiquettes sont beaucoup plus longs que les UIScrollView
, mais quand je lance l'application, je ne peux pas cliquer et faire défiler vers le bas...
Pourquoi cela pourrait-il être?
Grâce
- Nouveau 3/26/2013 je suis tombé sur un moyen plus facile de le faire sans code (réglage contentSize) stackoverflow.com/a/15649607/1705353
Vous devez vous connecter pour publier un commentaire.
Il est toujours bon de montrer un travail complet extrait de code:
Swift 4.0
Je n'ai pas trouvé un moyen de mettre en contentSize de l'IB (comme de Xcode 5.0).
Note:
Si vous utilisez la mise en page automatique le meilleur endroit pour placer ce code est à l'intérieur de la
-(void)viewDidLayoutSubviews
méthode .myScrollView.delegate = self
AUSSI, si cela ne fonctionne toujours pas, la réponse en dessous de ce qu'on a de très bons conseils (aller à votre xib/StoryBoard et vérifiez que l'option "mise en forme automatique" est désactivée). Pro-Tip: Vous pouvez également inclure des<UIScrollViewDelegate>
dans votre .h si vous voulez faire des choses comme par programmation de défilement de votre UIScrollView.viewDidLayoutSubviews
fait le travail pour moi.Si vous ne pouvez pas faire défiler l'affichage, même après que vous avez défini contentSize correctement,
assurez-vous que vous décochez "Utiliser la mise en forme automatique" dans Interface Builder -> Fichier Inspecteur.
viewDidLayoutSubviews:
. RessembleviewDidLayoutSubviews:
n'est jamais appelé.Vous devez définir la
contentSize
propriété de défilement de la vue pour faire défiler correctement.Si vous utilisez la mise en forme automatique, vous devez définir
contentSize
dansviewDidLayoutSubviews
pour être appliquées après la mise en page automatique est terminée.Le code pourrait ressembler à ceci:
contentSize
à la taille decontentView
, la taille de la scrollView et contentView semble se définir comme le même. Mais le réglage de la hauteur de lacontentSize
à une valeur supérieure à la hauteur decontentView
, il a travaillé.La réponse ci-dessus est correcte - de faire le défilement se produire, il est nécessaire de fixer la taille du contenu.
Si vous êtes en utilisant l'interface builder une belle façon de le faire est défini par l'utilisateur runtime attributs. Par exemple:
viewDidLayoutSubviews:
si l'utilisation de l'auto-layout.Essayez de redimensionner la taille du contenu pour un très grand nombre. Je ne comprenais pas pourquoi mon défiler la vue n'a pas de défilement, même lorsque son contenu est la taille semble être plus grand que la taille du contrôle. J'ai découvert que si la taille du contenu est plus petit que nécessaire, il ne fonctionne pas aussi.
Au lieu de 2000, vous pouvez mettre vos propres grands nombres. Et si cela fonctionne, cela signifie que votre contenu taille n'est pas assez grand lorsque vous redimensionnez.
Le délégué n'est pas nécessaire de faire défiler la vue au travail.
Assurez-vous que vous avez la contentSize propriété de défilement de la vue à la bonne taille (c'est à dire, un assez large pour englober l'ensemble de votre contenu.)
Décochez la case "Utiliser la mise en page automatique' a fait le tour pour moi.
De l'environnement:
xCode 5.0.2
Les Storyboards
ios7
Dans mon cas, j'ai dû mettre
delaysContentTouches
à vrai parce que les objets à l'intérieur de la scrollView étaient tous capturer les événements tactiles et de manutention eux-mêmes plutôt que de laisser la scrollView lui-même de la gérer.Ensemble
contentSize
propriété deUIScrollview
dansViewDidLayoutSubviews
méthode. Quelque chose comme ceciL'idée de pourquoi faire défiler la vue n'est pas le défilement parce que vous définissez la taille du contenu pour le défilement inférieure à la taille de défilement de la vue, ce qui est faux.
Vous devez définir le contenu de taille supérieure à la taille de votre barre de défilement de la vue à naviguer à travers elle pendant le défilement.
La même idée avec le zoom, vous définissez les valeurs min et max pour le zoom qui sera appliquée par l'intermédiaire d'un zoom d'action.
bienvenue 🙂
Un petit plus, tous les ci-dessus sont les réelles raisons de défilement de vue peut ne pas être défilement, mais parfois bêtement ce pourrait être la raison, en particulier lorsque le scrollview est ajouté dans le code et non pas de l'IB, vous pourriez avoir ajouté votre sous-vues de la vue parent et de ne pas le scrollview cela provoque la sous-vue pour ne pas faire défiler
et ne garder que le contenu définissez la taille et plus gros que le parent point de vue image (duhh!!)
si vous obtenez un message (IOS8 /swift) qui
viewDidLayoutSubviews
n'existe pas, utilisez la commande suivante à la placeCe qu'il est corrigé pour moi
Quelque chose qui n'était pas mentionné avant!
Assurez-vous que votre prise de courant est correctement connecté à la scrollView! Il devrait avoir un cercle plein, mais même si vous avez rempli le cercle, le scrollView peut pas connectée, alors vérifiez! Passez la souris sur le cercle et voir si la scrollview se mis en évidence! (C'était le cas pour moi)
Beaucoup de temps le code est correct si vous avez suivi un tuto mais ce que beaucoup de débutants ne savent pas est que le scrollView est PAS va défiler normalement par le simulateur. Il est supposé faire défiler uniquement lorsque vous appuyez sur le tapis de souris et simultanément de défilement. De nombreux Expérimentés XCode/Swift/Obj-C, les utilisateurs sont donc de l'utiliser pour ce faire, et afin qu'ils ne savent pas comment il pourrait éventuellement être négligé par les débutants. Ciao 🙂
Ce code fonctionne parfaitement bien, aussi longtemps que vous faites ce que j'ai dit ci-dessus
J'ai fait ce travail à mon premier essai. Avec mise en page automatique et tout et tout, pas de code supplémentaire. Puis une vue de collection est allé à la banane, plantage au moment de l'exécution, je ne pouvais pas trouver ce qui n'allait pas, alors j'ai supprimé et recréé (je suis en utilisant Xcode 10 Beta 4. Il se sentait comme un bug) et puis le défilement a disparu. L'affichage de la Collection travaillé encore une fois, si!
De nombreuses heures plus tard.. c'est ce qu'il fixe pour moi. J'ai eu la mise en page suivante:
UIView
Tout est dans le contraintes. De la Zone de sécurité est défini automatiquement par le système. Dans le pire des cas supprimer toutes les contraintes pour faire défiler et vues de contenu et ne pas ont IB réinitialisation/les créer pour vous. Les faire manuellement, il fonctionne.
fondamentalement, le concept est d'avoir un Contenu à la vue de côté d'Scrollview, qui est à côté de la Zone de Sécurité.
Mais, comme tel, il n'a pas de travail. Contenu afficher les appels à la hauteur. J'ai essayé tout ce que je pouvais et le seul à le faire, le truc a été un l'affichage du Contenu de la hauteur créé contrôle en faisant glisser le Contenu de la vue.. à lui-même. Qui a défini une hauteur fixe, dont la valeur a été calculée à partir de la Taille de la vue-contrôleur (défini comme libre, plus long que la réelle affichage, contenant tous mes sous-vues) et, enfin, il a travaillé à nouveau!
Si aucune des autres solutions de travail pour vous, vérifiez que votre barre de défilement de la vue est en fait un
UIScrollView
dans Interface Builder.À un certain point dans les derniers jours, mon
UIScrollView
spontanément changé de type à unUIView
, même si sa classe a ditUIScrollView
dans l'inspecteur. Je suis en utilisantXcode 5.1 (5B130a)
.Vous pouvez soit créer une nouvelle défilement de la vue et de copier les mesures, les paramètres et les contraintes de l'ancien point de vue, ou vous pouvez changer manuellement votre point de vue à un
UIScrollView
dans lexib
fichier. J'ai fait une comparaison et a constaté les différences suivantes:Original:
Après type spontanément changé:
Je l'ai donc remplacé le
<view>
ligne avec mon original<scrollView>
ligne.J'ai aussi remplacé le point de vue de la balise de fermeture
</view>
avec</scrollView>
.Assurez-vous de garder l'id est le même que le point de vue actuel, dans ce cas: id="qRn-TP-cXd".
J'ai également eu à vider le xib à partir de Xcode cache en supprimant l'application de la dérivée de données:
Xcode->Window->Organizer->Projects
, choisissez votre projet, le calcul de la ligne de transmission de Données, cliquez sur Supprimer...Ou si vous utilisez un appareil:
Xcode->Window->Organizer->Device
, choisissez votre appareil->Applications, choisissez votre application, cliquez sur (-)Maintenant nettoyer le projet, et de supprimer l'application, à partir du simulateur/appareil:
Xcode->Product->Clean
Simulator/device->press
et maintenez-laapp->click
l' (X) pour supprimerVous devriez alors être en mesure de construire et d'exécuter votre application et ont la fonctionnalité de défilement de nouveau.
P. S. je n'ai pas eu à régler le défilement de la vue de la taille du contenu dans
viewDidLayoutSubviews
ou de désactiver automatiquement la mise en page, mais YMMV.Si votre
scrollView
est une sous-vue d'uncontainerView
d'un certain type, alors assurez-vous que votrescrollView
est dans le cadre ou les limites de lacontainerView
. J'ai eucontainerView.clipsToBounds = NO
qui toujours m'a permis de voir la scrollView, mais parce quescrollView
n'était pas dans les limites de lacontainerView
il ne serait pas en mesure de détecter les événements tactiles.Par exemple:
Vous serez en mesure de voir la scrollView, mais il ne recevra pas les interactions de l'utilisateur.
ajoutant le code suivant dans
viewDidLayoutSubviews
a fonctionné pour moi avec mise en page automatique. Après avoir essayé toutes les réponses:Ajouter le
UIScrollViewDelegate
et en ajoutant le code suivant à laviewDidAppear
méthode fixe pour moi.Mon problème a été résolu par:
Une fois que j'ai enlevé le haut et/ou bas de contraintes liées à la zone de sécurité et/ou superview, les points de vue à l'intérieur de la scrollView peut défiler à nouveau et de ne pas rester fixé sur le dessus du bas de l'écran!
Espère que cela s'arrête quelqu'un d'autre à des heures de douleur à ce problème particulier.
Après avoir échoué avec les réponses dans ce fil, je suis tombé sur cet article avec la solution.
Il y a deux choses à ne pas intuitif sur la configuration de la scrollview avec mise en page automatique:
C'est l'essentiel de cet article. Pour une explication complète, y compris les illustrations, check it out.
J'ai trouvé que, avec cette mise en page automatique question... si je fais la
ViewController
utilisationUIView
au lieu deUIScrollView
pour la classe... puis il suffit d'ajouter unUIScrollView
moi-même... qu'il fonctionne.J'ai eu le même problème au bureau de l'IB.
Après le réglage de la pointe, derrière, en haut et en bas de la scrollView à son superView. J'ai fait les modifications suivantes à faire le containerView de défilement, ce qui a fonctionné.
Pour faire de la scrollView seulement faire défiler sur la direction horizontale de faire de la contrainte de la scrollView de centerY = ContainerView de centerY
et de le rendre à la verticale de défilement faire de la scrollView de centerX = ContainerView de centerX
encore un autre plaisir de cas:
scrollview.superview.userInteractionEnabled doit être vrai
J'ai perdu 2+h chasser juste pour comprendre le parent
est UIImageView qui, naturellement, a userInteractionEnabled == false