60 votes

UIScrollView : pagination horizontale, défilement vertical ?

Comment puis-je forcer un UIScrollView dans lequel la pagination et le défilement sont activés à ne se déplacer que verticalement ou horizontalement à un moment donné ?

Je crois savoir que le directionalLockEnabled devrait permettre d'atteindre cet objectif, mais un balayage diagonal fait toujours défiler la vue en diagonale au lieu de limiter le mouvement à un seul axe.

Edit : pour être plus clair, j'aimerais permettre à l'utilisateur de défiler horizontalement OU verticalement, mais pas les deux simultanément.

4voto

julianlubenov Points 49

Pour les gars, il suffit de faire en sorte que la hauteur de la sous-vue soit la même que celle de la vue défilante et de la taille du contenu. Le défilement vertical est alors désactivé.

2voto

Jon Conner Points 107

Ce que j'ai fait, c'est créer une page UIScrollView avec un cadre de la taille de l'écran et définir la taille du contenu à la largeur nécessaire pour tout mon contenu et une hauteur de 1 (merci Tonetel). J'ai ensuite créé des pages de menu UIScrollView avec des cadres définis pour chaque page, de la taille de l'écran, et j'ai défini la taille du contenu de chacune d'elles à la largeur de l'écran et à la hauteur nécessaire pour chacune d'elles. Ensuite, j'ai simplement ajouté chacune des pages de menu à la vue de pagination. Assurez-vous que la pagination est activée sur la vue de défilement de pagination mais désactivée sur les vues de menu (elle devrait être désactivée par défaut) et vous devriez être prêt à partir.

La vue défilante de la pagination défile désormais horizontalement, mais pas verticalement en raison de la hauteur du contenu. Chaque page défile verticalement mais pas horizontalement en raison des contraintes de taille de son contenu également.

Voici le code si cette explication a laissé quelque chose à désirer :

UIScrollView *newPagingScrollView =  [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
[newPagingScrollView setPagingEnabled:YES];
[newPagingScrollView setShowsVerticalScrollIndicator:NO];
[newPagingScrollView setShowsHorizontalScrollIndicator:NO];
[newPagingScrollView setDelegate:self];
[newPagingScrollView setContentSize:CGSizeMake(self.view.bounds.size.width * NumberOfDetailPages, 1)];
[self.view addSubview:newPagingScrollView];

float pageX = 0;

for (int i = 0; i < NumberOfDetailPages; i++)
{               
    CGRect pageFrame = (CGRect) 
    {
        .origin = CGPointMake(pageX, pagingScrollView.bounds.origin.y), 
        .size = pagingScrollView.bounds.size
    };
    UIScrollView *newPage = [self createNewPageFromIndex:i ToPageFrame:pageFrame]; // newPage.contentSize custom set in here        
    [pagingScrollView addSubview:newPage];

    pageX += pageFrame.size.width;  
}

1voto

philsquared Points 13547

Dans la documentation :

"la valeur par défaut est NO, ce qui signifie que le défilement est autorisé dans les deux directions, horizontale et verticale. Si la valeur est YES et que l'utilisateur commence à faire glisser dans une direction générale (horizontalement ou verticalement), la vue défilante désactive le défilement dans l'autre direction."

Je pense que la partie importante est "si... l'utilisateur commence traîner dans une direction générale". Donc s'ils commencent à traîner en diagonale, cela ne fonctionne pas. Non pas que ces documents soient toujours fiables en matière d'interprétation, mais cela semble correspondre à ce que vous voyez.

Cela semble raisonnable. Je dois demander - pourquoi voulez-vous restreindre à l'horizontale ou à la verticale à tout moment ? Peut-être que UIScrollView n'est pas l'outil qu'il vous faut ?

1voto

Praveen M Points 175

Besoin de réinitialiser _isHorizontalScroll à NO dans touchesEnded y touchesCancelled .

1voto

Jeremy Points 11

Merci Tonetel. J'ai légèrement modifié votre approche, mais c'était exactement ce dont j'avais besoin pour empêcher le défilement horizontal.

self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width, 1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X