J'ai un UIScrollView
qui contient beaucoup de UIImageView
s, UILabels, etc ... les étiquettes sont beaucoup plus longues que le 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
ios
iphone
ipad
uiscrollview
marque
la source
la source
Réponses:
Il est toujours bon d'afficher un extrait de code fonctionnel complet:
Swift 4.0
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 mettre ce code est à l'intérieur de la
-(void)viewDidLayoutSubviews
méthode.la source
myScrollView.delegate = self
AUSSI, si cela ne fonctionne toujours pas, la réponse ci-dessous celle-ci a de BONS conseils (allez dans votre xib / StoryBoard et assurez-vous que "AutoLayout" est désactivé). Astuce de pro: Vous pouvez également inclure<UIScrollViewDelegate>
dans votre fichier .h si vous souhaitez faire des choses comme faire défiler par programme votre UIScrollView.viewDidLayoutSubviews
a fonctionné pour moi.Si vous ne pouvez pas faire défiler la vue même après avoir défini correctement contentSize , assurez-vous de décocher "Utiliser la mise en page automatique" dans Interface Builder -> Inspecteur de fichiers.
la source
Vous devez définir la
contentSize
propriété de la vue de défilement pour qu'elle défile correctement.Si vous utilisez autolayout, vous devez définir
contentSize
dansviewDidLayoutSubviews
afin qu'il soit appliqué après les finalise autolayout.Le code pourrait ressembler à ceci:
la source
contentSize
à la taille decontentView
, la taille de scrollView et contentView semble être définie comme la même. Mais régler la hauteur de lacontentSize
à une valeur supérieure à la hauteur decontentView
, cela a fonctionné.viewDidLayoutSubviews
peut être appelé plusieurs fois au cours d'un cycle de vie, vous courez donc le risque d'augmenter la hauteur plus grande que prévu.La réponse ci-dessus est correcte - pour que le défilement se produise, il est nécessaire de définir la taille du contenu.
Si vous utilisez le générateur d'interface, une façon intéressante de le faire est d'utiliser les attributs d'exécution définis par l'utilisateur. Par exemple:
la source
Essayez de redimensionner la taille du contenu à des nombres énormes. Je ne pouvais pas comprendre pourquoi ma vue de défilement ne défile pas même lorsque la taille de son contenu semble être plus grande que la taille de contrôle. J'ai découvert que si la taille du contenu est plus petite que nécessaire, cela ne fonctionne pas également.
Au lieu de 2000, vous pouvez mettre vos propres grands 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 de défilement fonctionne.
la source
Assurez-vous que la propriété contentSize de la vue de défilement est définie sur la taille correcte (c'est-à-dire, suffisamment grande pour englober tout votre contenu).
la source
Décocher "Utiliser la mise en page automatique" a fait l'affaire pour moi.
Environnement: xCode 5.0.2 Storyboards ios7
la source
Dans mon cas, j'ai dû définir
delaysContentTouches
sur true car les objets à l'intérieur du scrollView capturaient tous les événements tactiles et se géraient eux-mêmes plutôt que de laisser le scrollView le gérer.la source
Définit la
contentSize
propriété de la méthodeUIScrollview
inViewDidLayoutSubviews
. Quelque chose comme çala source
L'idée de pourquoi la vue de défilement ne défile pas parce que vous définissez la taille du contenu pour le défilement inférieure à 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 la parcourir tout en faisant défiler.
La même idée avec le zoom, vous définissez les valeurs min et max pour le zoom qui seront appliquées par l'action de zoom.
Bienvenue :)
la source
Un petit ajout, tous ci-dessus sont les raisons réelles pour lesquelles votre vue de défilement peut ne pas défiler, mais parfois sans réfléchir, cela pourrait être la raison spécialement lorsque la vue de défilement est ajoutée via le code et non IB, vous avez peut-être ajouté vos sous-vues à la vue parente et non à la vue de défilement cela fait que la sous-vue ne défile pas
et gardez la taille du contenu définie et plus grande que le cadre de vue parent (duhh !!)
la source
Je l'ai fait fonctionner à mon premier essai. Avec mise en page automatique et tout, aucun code supplémentaire. Ensuite, une vue de collection est devenue banane, plantant au moment de l'exécution, je n'ai pas trouvé ce qui n'allait pas, alors je l'ai supprimée et recréée (j'utilise Xcode 10 Beta 4. Cela ressemblait à un bug) et puis le défilement avait disparu. La vue Collection fonctionnait à nouveau, cependant!
Plusieurs heures plus tard ... c'est ce qui a résolu le problème pour moi. J'avais la disposition suivante:
UIView
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 vues de défilement et de contenu et ne laissez pas IB les réinitialiser / les créer pour vous. Faites-les manuellement, cela fonctionne.
fondamentalement, le concept est d'avoir une vue de contenu adaptée à Scrollview, qui correspond à la zone de sécurité.
Mais en tant que tel, cela n'a pas fonctionné. L'affichage du contenu a manqué la hauteur. J'ai essayé tout ce que je pouvais et le seul à faire l'affaire a été une hauteur de vue de contenu créée en faisant glisser la vue de contenu ... vers elle-même . Cela a défini une hauteur fixe, dont la 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 enfin cela a fonctionné à nouveau!
la source
si vous recevez un message (IOS8 / swift) qui
viewDidLayoutSubviews
n'existe pas, utilisez plutôt ce qui suitCela l'a corrigé pour moi
la source
Quelque chose qui n'a pas été mentionné auparavant!
Assurez-vous que votre prise était correctement connectée au scrollView! Il devrait avoir un cercle rempli, mais même si vous avez rempli le cercle, scrollView n'est peut-être pas connecté - alors vérifiez! Survolez le cercle et voyez si la vue de défilement réelle est mise en évidence! (C'était un cas pour moi)
la source
La plupart du temps, le code est correct si vous avez suivi un tutoriel, mais ce que de nombreux débutants ne savent pas, c'est que le scrollView ne va PAS faire défiler normalement le simulateur. Il est supposé faire défiler uniquement lorsque vous appuyez sur le tapis de souris et faites défiler simultanément. De nombreux utilisateurs expérimentés de XCode / Swift / Obj-C sont tellement habitués à faire cela et ne savent donc pas comment cela pourrait être ignoré par les débutants. Ciao :-)
Ce code fonctionnera parfaitement bien tant que vous faites ce que j'ai dit ci-dessus
la source
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
type a spontanément changé en aUIView
, même si sa classe a ditUIScrollView
dans l'inspecteur. J'utiliseXcode 5.1 (5B130a)
.Vous pouvez soit créer une nouvelle vue de défilement et copier les mesures, les paramètres et les contraintes de l'ancienne vue, soit changer manuellement votre vue en a
UIScrollView
dans lexib
fichier. J'ai fait une comparaison et j'ai trouvé les différences suivantes:Original:
Après que le type a changé spontanément:
J'ai donc remplacé la
<view>
ligne par ma<scrollView>
ligne d' origine .J'ai également remplacé la balise de fermeture de la vue
</view>
par</scrollView>
.Assurez-vous de garder l'identifiant identique à 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 Données dérivées, cliquez sur Supprimer ...Ou si vous utilisez un appareil:
Xcode->Window->Organizer->Device
, choisissez votre appareil-> Applications, choisissez votre application, cliquez sur (-)Nettoyez maintenant le projet et supprimez l'application du simulateur / de l'appareil:
Xcode->Product->Clean
Simulator/device->press
et maintenez leapp->click
(X) pour le supprimerVous devriez alors pouvoir créer et exécuter votre application et avoir à nouveau la fonctionnalité de défilement.
PS Je n'ai pas eu à définir la taille du contenu de la vue de défilement
viewDidLayoutSubviews
ou à désactiver la mise en page automatique, mais YMMV.la source
Si votre
scrollView
est une sous-vue d'uncontainerView
certain type, assurez-vous que votrescrollView
est dans le cadre ou les limites ducontainerView
. J'avaiscontainerView.clipsToBounds = NO
ce qui me permettait toujours de voir le scrollView, mais parce qu'ilscrollView
n'était pas dans les limites decontainerView
celui-ci, je ne détecterais pas les événements tactiles.Par exemple:
Vous pourrez voir le scrollView mais il ne recevra pas d'interactions utilisateur.
la source
l'ajout du code suivant a
viewDidLayoutSubviews
fonctionné pour moi avec Autolayout. Après avoir essayé toutes les réponses:la source
Ajoutez
UIScrollViewDelegate
et ajoutez le code suivant à laviewDidAppear
méthode corrigée pour moi.la source
Mon problème a été résolu par:
Une fois que j'ai supprimé les contraintes de haut et / ou de bas liées à la zone de sécurité et / ou à la supervision, les vues à l'intérieur du scrollView pouvaient à nouveau défiler et ne restaient pas fixées en haut ou en bas de l'écran!
J'espère que cela arrête quelqu'un d'autre des heures de douleur avec ce problème particulier.
la source
encore un autre cas amusant:
scrollview.superview.userInteractionEnabled doit être true
J'ai perdu plus de 2 heures à courir après cela juste pour comprendre que le parent est UIImageView qui, naturellement, a userInteractionEnabled == false
la source
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 mise en page automatique:
C'est l'essentiel de cet article. Pour une explication complète, y compris des illustrations, consultez-le.
la source
J'ai trouvé qu'avec ce problème de mise en page automatique ... si je fais juste l'
ViewController
utilisationUIView
au lieu deUIScrollView
pour la classe ... alors ajoutez simplement unUIScrollView
moi - même ... que cela fonctionne.la source
J'ai eu le même problème à IB.
Après avoir défini le début, la fin, le haut et le bas de scrollView sur sa superView. J'ai apporté les modifications suivantes pour rendre le containerView scrollable, ce qui a fonctionné.
Pour que scrollView ne défile que dans le sens horizontal, effectuez la contrainte avec le centre de scrollView Y = le centre de ContainerView Y
et pour le faire défiler verticalement, faites centerX de scrollView = centerX de ContainerView
la source