web-dev-qa-db-fra.com

Comment verrouiller le défilement horizontal d'un scrollView dans iOS

j'ai un scrollView. Je veux qu'il défile dans une seule direction (VERTICAL). Existe-t-il un moyen de verrouiller le défilement horizontal ... ?? ...

25
A for Alpha

Même réponse (adaptée) pour vous comme dans:

Désactivation du défilement vertical dans UIScrollView

à droite, toutes les réponses ici sont ok ...

mais si, pour une raison quelconque, votre taille de contenu doit être supérieure à UIScrollView dans les deux dimensions, vous pouvez désactiver le défilement horizontal en implémentant la méthode de protocole UIScrollView-(void)scrollViewDidScroll:(UIScrollView *)aScrollView

ajoutez simplement ceci dans votre UIViewController

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

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

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

26
meronix
self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items);

devrait aider. Je viens de verrouiller ma vue de défilement horizontalement, en appliquant la même technique.

13
Sean S Lee

La méthode la plus sûre et la plus efficace que j'ai trouvée pour limiter le déplacement d'une vue de défilement consiste à sous-classe UIScrollView et à remplacer setContentOffset: animé: et setContentOffset: methods (code ci-dessous).

L’avantage de surcharger ces méthodes est qu’elle modifie directement le paramètre demandé contentOffset avant que le code UIKit ne commence à agir, évitant ainsi l’un des effets secondaires pouvant se produire lors de la modification de contentOffset dans scrollViewDidScroll: ou autre UIScrollViewDelegate méthodes.

La création de la nouvelle sous-classe ne prend que quelques minutes et fonctionne à merveille.

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset animated:animated];
}

- (void)setContentOffset:(CGPoint)contentOffset {
    // restrict movement to vertical only
    CGPoint newOffset = CGPointMake(0, contentOffset.y);
    [super setContentOffset:newOffset];    
}
10
Mike Hay

Tu peux essayer ça,

self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);

ici 1450 est ma vue à la hauteur.

2
Sharme

Voir this question, vous devez définir la taille de défilement sur la taille correspondante de la vue afin qu’il n’y ait rien à faire défiler.

2
Tomas Vana

Si la propriété contentSize de UIScrollView a la même largeur que la largeur réelle de UIScrollView, aucun défilement horizontal ne sera possible.

Voulez-vous arrêter le défilement horizontal lorsque le défilement horizontal est valide? (c'est-à-dire que la contentSize est plus large que la largeur UIScrollView réelle?) Si «oui», pourquoi voulez-vous le faire?

2
occulus

ScrollView ne peut défiler horizontalement que si vous définissez une largeur de contentSize supérieure au cadre scrollView. Si vous définissez la largeur de contentSize sur la même chose que le scrollview, elle ne défilera pas. Par exemple

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

1
user655152

oh, depuis iOS7, utilisez ceci (dans initWithNibName):

self.automaticallyAdjustsScrollViewInsets = NO;

et créez le défilement de pages 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];
1
Mirko Brunner

Dans mon cas, la taille du contenu était supérieure à celle de UIScrollView pour x et y. Pour moi, la réponse de Meronixe a très bien fonctionné, mais elle n’a pas été complète pour mes besoins. Malheureusement, la barre de défilement horizontale était toujours visible.

Je pourrais changer cela avec le code suivant dans

- (void)webViewDidFinishLoad:(UIWebView *)webView

[self.webView.scrollView setShowsHorizontalScrollIndicator:NO];
0
BCI

Rapide

Faire contentOffset.x = 0 pour désactiver le défilement horizontal

   extension ViewController: UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
            scrollView.contentOffset.x = 0//to lock horizontal scrolling
            //scrollView.contentOffset.y = 0//to lock vertical scrolling
        }
    }

En outre, vous pouvez désactiver l'indicateur de défilement en tant que

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator
    scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator
0
Jack