web-dev-qa-db-fra.com

Comment désactiver le défilement horizontal de UIScrollView?

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?

79
Rahul Vyas

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.

116
Dave DeLong

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:.

83
Dinesh Raja

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)
10
Dan Beaulieu

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];
10
Mirko Brunner

Vous pouvez sélectionner la vue, puis sous Attributes Inspector décochez User Interaction Enabled.

4
Coder221

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
}
1
Rincha

Utilisez cette seule ligne.

self.automaticallyAdjustsScrollViewInsets = NO;

0
Karthickkck

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

0
Gulfam Khan

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

0
Naishta

Essaye ça:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
0
Torongo

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).

0
PatriciaW