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?
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?
Réponses:
Vous devez définir la contentSize
propriété du UIScrollView
. Par exemple, si vous avez UIScrollView
une largeur de 320 pixels (la largeur de l'écran), vous pouvez faire ceci:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Le UIScrollView
défilera alors uniquement verticalement, car il peut déjà tout afficher horizontalement.
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Le code ci-dessus empêche les changements dans x
et y
de a scrollview contentOffset
et cela conduit à arrêter le défilement dans la scrollViewDidScroll:
méthode.
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 et scrollView.contentOffset.x = 0.0
pour arrêter le défilement horizontal, dans la scrollViewDidScroll()
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
self.automaticallyAdjustsScrollViewInsets = NO;
// et créez votre défilement de page avec 3 pages
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
m'a aidé à résoudre le problème de défilement fluide (pas de glissement). Le problème était dans method scrollViewWillEndDragging:
- targetContentOffset était le même que scrollView.contentOffset et la logique de détection de page ne fonctionne pas correctement.
Solution rapide
Créez deux points de vente, un pour votre vue et un pour votre vue de défilement:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Ensuite, dans votre viewDidLayoutSubviews, vous pouvez ajouter le code suivant:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
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:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
Dans mon cas, avec Swift 4.2, vous pouvez utiliser:
Désactiver le défilement vertical:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Désactiver le défilement horizontal:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
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
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).
Introduit dans iOS 11 est une nouvelle propriété sur UIScrollView
var contentLayoutGuide: UILayoutGuide
La documentation indique que vous:
Utilisez ce guide de mise en page lorsque vous souhaitez créer des contraintes de mise en page automatique liées à la zone de contenu d'une vue de défilement.
En plus de toute autre contrainte de mise en page automatique que vous pourriez ajouter, vous souhaiterez contraindre widthAnchor
les UIScrollView
's contentLayoutGuide
à avoir la même taille que le "cadre". Vous pouvez utiliser le frameLayoutGuide
(également introduit dans iOS 11) ou n'importe quelle largeur externe (telle que la vôtre superView
.)
exemple:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Documentation: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Une fois que je l'ai fait en remplaçant UIScrollView par un UITableView avec seulement 1 cellule, cela a bien fonctionné.
Utilisez cette seule ligne.
self.automaticallyAdjustsScrollViewInsets = NO;