J'ai une UIView
comme le Springboard de l'iPhone. Je l'ai créé en utilisant UIScrollView
et UIButtons
. Je veux désactiver le défilement horizontal sur ledit scrollview. Je veux seulement le défilement vertical. Comment puis-je accomplir cela?
Vous devez définir la propriété contentSize
de la UIScrollView
. Par exemple, si votre UIScrollView
a une largeur de 320 pixels (la largeur de l'écran), procédez comme suit:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
La UIScrollView
défilera alors uniquement verticalement, car elle peut déjà tout afficher horizontalement.
MISE À JOUR: (après que @EranMarom ait souligné son commentaire)
Vous pouvez arrêter le défilement horizontal ou vertical dans la méthode ScrollViewDelegate
Méthode . Voici comment,
Arrête le défilement horizontal:
Si vous souhaitez faire défiler horizontalement, vous devez augmenter le contentOffset.x. Empêcher que cela 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 le contentOffset.y. En empêchant cela, le défilement de la vue à défiler s'arrête verticalement.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Le code ci-dessus empêche les modifications dans x
et y
d'un scrollview contentOffset
et conduit à arrêter le défilement dans la méthode scrollViewDidScroll:
.
Solution rapide
Créez deux sorties, une pour votre vue et une 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
Nous avons collecté la hauteur et la largeur de la vue et défini la taille du contenu de scrollViews en conséquence. Cela empêchera votre défilement 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)
depuis l'utilisation d'iOS7
self.automaticallyAdjustsScrollViewInsets = NO;
// et créez votre page scroller 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];
Vous pouvez sélectionner la vue, puis sous Attributes Inspector
décochez User Interaction Enabled
.
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
}
Utilisez cette seule ligne.
self.automaticallyAdjustsScrollViewInsets = NO;
Dans mon cas, la largeur de contentView était supérieure à celle d’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'avais la table content contentInset défini dans viewDidLoad (comme ci-dessous) qui cause le défilement horizontal
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Vérifiez s'il existe des tablesview contentInset définies pour différentes raisons et désactivez-les
Essaye ça:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
Une fois que je l’ai fait, remplacer UIScrollView par un UITableView avec 1 seule cellule a très bien fonctionné.
J'ai eu du mal avec cela pendant un certain temps en essayant sans succès les diverses suggestions de ce sujet et d'autres.
Cependant, dans un autre fil de discussion (ne sachant pas où), quelqu'un a suggéré que l'utilisation d'une contrainte négative sur UIScrollView fonctionnait pour lui.
J'ai donc essayé diverses 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 à scrollview et d’ajouter une textview (invisible) d’une largeur de 320 (et centrée).