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 ... ?? ...
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
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.
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];
}
Tu peux essayer ça,
self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450);
ici 1450 est ma vue à la hauteur.
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.
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?
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)]
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];
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];
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