J'ai un UIView
tremplin semblable à celui de l'iPhone. Je l'ai créé en utilisant un UIScrollView
et UIButtons
. Je veux désactiver le défilement horizontal sur ledit scrollview. Je veux seulement un défilement vertical. Comment faire cela?
ios
objective-c
uiscrollview
Rahul Vyas
la source
la source
Réponses:
Vous devez définir la
contentSize
propriété duUIScrollView
. Par exemple, si vous avezUIScrollView
une largeur de 320 pixels (la largeur de l'écran), vous pouvez faire ceci:Le
UIScrollView
défilera alors uniquement verticalement, car il peut déjà tout afficher horizontalement.la source
MISE À JOUR: (après que @EranMarom l'ait souligné dans son commentaire)
Vous pouvez arrêter le défilement horizontal ou le défilement vertical dans la
ScrollViewDelegate
méthode. Voici comment,Arrête le défilement horizontal:
Si vous souhaitez faire défiler horizontalement, vous devez augmenter la valeur contentOffset.x. Empêcher que s'arrête le défilement de la vue de défilement dans le sens horizontal.
Arrête le défilement vertical:
Si vous souhaitez faire défiler verticalement, vous devez augmenter la valeur contentOffset.y. Empêcher que s'arrête le défilement de la vue de défilement dans le sens vertical.
Le code ci-dessus empêche les changements dans
x
ety
de ascrollview contentOffset
et cela conduit à arrêter le défilement dans lascrollViewDidScroll:
méthode.la source
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
pour désactiver le défilement horizontal. Je le trouve plus lisible, il est plus petit et il ne sert à rien de faire le test pour zéro car il n'y a pratiquement pas de surcharge avec du code qui s'exécute rarement (c'est-à-dire quelques dizaines de fois par seconde max).scrollView.contentOffset.y = 0.0
pour arrêter le défilement vertical etscrollView.contentOffset.x = 0.0
pour arrêter le défilement horizontal, dans lascrollViewDidScroll()
fonction délégué. Cependant, je pense que s'assurer que l'scrollView.contentSize
égalitéscrollView.frame.size
est égale à est une meilleure solution (correcte). Voir la réponse @danbeaulieu.depuis l'utilisation d'iOS7
// et créez votre défilement de page avec 3 pages
la source
self.collectionView.pagingEnabled = YES;
m'a aidé à résoudre le problème de défilement fluide (pas de glissement). Le problème était dans methodscrollViewWillEndDragging:
- targetContentOffset était le même que scrollView.contentOffset et la logique de détection de page ne fonctionne pas correctement.Créez deux points de vente, un pour votre vue et un pour votre vue de défilement:
Ensuite, dans votre viewDidLayoutSubviews, vous pouvez ajouter le code suivant:
Ce que nous avons fait, c'est collecter la hauteur et la largeur de la vue et définir la taille du contenu scrollViews en conséquence. Cela empêchera votre scrollview de défiler horizontalement.
Plus de pensées:
CGSizeMake prend une largeur et une hauteur en utilisant CGFloats. Vous devrez peut-être utiliser votre hauteur existante UIScrollViews pour le deuxième paramètre. Ce qui ressemblerait à ceci:
la source
Dans mon cas, avec Swift 4.2, vous pouvez utiliser:
Désactiver le défilement vertical:
Désactiver le défilement horizontal:
la source
Vous pouvez sélectionner la vue, puis
Attributes Inspector
décocherUser Interaction Enabled
.la source
Dans mon cas, la largeur du contentView était supérieure à la largeur de UIScrollView et c'était la raison du défilement horizontal indésirable. Je l'ai résolu en définissant la largeur de contentView égale à la largeur de UIScrollView.
J'espère que ça aide quelqu'un
la source
J'ai eu le tableview contentInset défini dans viewDidLoad (comme ci-dessous) ce qui cause le défilement horizontal
Vérifiez s'il y a un contenu tableviewInset défini pour différentes raisons et désactivez-le
la source
J'ai eu du mal avec cela pendant un certain temps en essayant sans succès les différentes suggestions de ce sujet et d'autres fils.
Cependant, dans un autre thread (je ne sais pas où), quelqu'un a suggéré que l'utilisation d'une contrainte négative sur UIScrollView fonctionnait pour lui.
J'ai donc essayé différentes combinaisons de contraintes avec des résultats incohérents. Ce qui a finalement fonctionné pour moi a été d'ajouter des contraintes de début et de fin de -32 à la vue de défilement et d'ajouter une vue de texte (invisible) avec une largeur de 320 (et centrée).
la source
Essaye ça:
la source
Désactivez le défilement horizontal en remplaçant la
contentOffset
propriété dans la sous-classe.la source
Introduit dans iOS 11 est une nouvelle propriété sur
UIScrollView
La documentation indique que vous:
En plus de toute autre contrainte de mise en page automatique que vous pourriez ajouter, vous souhaiterez contraindre
widthAnchor
lesUIScrollView
'scontentLayoutGuide
à avoir la même taille que le "cadre". Vous pouvez utiliser leframeLayoutGuide
(également introduit dans iOS 11) ou n'importe quelle largeur externe (telle que la vôtresuperView
.)exemple:
Documentation: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
la source
Une fois que je l'ai fait en remplaçant UIScrollView par un UITableView avec seulement 1 cellule, cela a bien fonctionné.
la source
Utilisez cette seule ligne.
self.automaticallyAdjustsScrollViewInsets = NO;
la source