web-dev-qa-db-fra.com

Désactivation du défilement vertical dans UIScrollView

Il existe une option dans IB pour décocher le défilement vertical dans une vue à défilement, mais cela ne semble pas fonctionner.

Comment définir l'affichage de défilement pour qu'il défile uniquement horizontalement et non verticalement dans le code plutôt que dans IB?

83
jarryd

Essayez de définir la hauteur de contentSize à la hauteur de scrollView. Ensuite, le défilement vertical doit être désactivé car il n’y aurait rien à faire défiler verticalement.

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
118
pt2ph8

depuis iOS7:

first: la largeur de la taille du contenu doit être égale à la largeur de votre scrollview

deuxième: dans votre initWithNibName:

self.automaticallyAdjustsScrollViewInsets = NO;

C'est ça.

137
Mirko Brunner

oui, la réponse de pt2ph8 est juste,

mais si, pour une raison quelconque, votre contentSize devait être supérieur à UIScrollView, vous pouvez désactiver le défilement vertical implémentant la méthode du protocole UIScrollView.

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

il suffit d'ajouter ceci dans votre UIViewController

float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

c'est simplement la méthode appelée lorsque l'utilisateur fait défiler votre UIScrollView, ce qui force le contenu à toujours conserver le même .y

49
meronix

Inclure la méthode suivante

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

et définissez la largeur de la taille du contenu de la vue de défilement égale à la largeur de la vue de défilement.

22
Febin P

Vous devez indiquer 0 dans la taille du contenu pour désactiver la direction souhaitée.

Pour désactiver le défilement vertical

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

Pour désactiver le défilement horizontal

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
19
Mani

J'ai mis à jour la taille du contenu pour désactiver le défilement vertical, et la possibilité de faire défiler restait toujours. Ensuite, j'ai compris que je devais aussi désactiver le rebond vertical, pour désactiver complètement le défilement.

Peut-être y a-t-il aussi des gens avec ce problème.

17
bolonn
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

vous devez avoir confirmé à UIScrollViewDelegate

aScrollView.delegate = self;
13
user3693546

Il suffit de définir le y pour être toujours au top. Besoin de se conformer à UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}

Cela conservera l'effet Décélération/Accélération du défilement.

3
manuelsantos

Sur iOS 11, n'oubliez pas d'ajouter ce qui suit, si vous souhaitez créer une vue à défilement qui colle à l'écran plutôt qu'à une zone sécurisée.:

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
3
Michael