45 votes

Taille de pagination personnalisée de UIScrollView

La pagination dans UIScrollView est une excellente fonctionnalité, ce dont j'ai besoin ici est de définir la pagination à une distance plus petite, par exemple je veux que mon UIScrollView pagine moins que la largeur du cadre de l'UIScrollView. Merci

1voto

Martin Metselaar Points 169

J'ai eu le même problème et j'ai donc créé un UIScrollView personnalisé. Il est disponible sur Github maintenant parce que lorsque j'ai cherché, je n'ai pas trouvé de solutions comme celle-ci. Bonne lecture ! https://github.com/MartinMetselaar/MMCPSScrollView

MMCPSScrollView* scrollView = [[MMCPSScrollView alloc] initWithFrame:self.view.bounds];
[scrollView setType:MMCPSScrollVertical];
[scrollView setPageHeight:250];
[scrollView setPageSize:2];
[self.view addSubview:scrollView];

Si vous avez d'autres questions sur ce composant, n'hésitez pas à les poser.

1voto

danipralea Points 1185

L'ajout de reconnaissances de gestes ou d'autres vues secondaires, etc. est stupide. Il suffit de définir le délégué de la vue de défilement comme un élément de ce qui suit :

// This is for a vertical scrolling scroll view. 
// Let's say you want it to snap to every 160 pixels :    

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{     
     int y = scrollView.contentOffset.y;
     int yOff = y % 160;
     if(yOff < 80)
          y -= yOff;
     else
          y += 160 - yOff;

     [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, y) animated:YES];
}

// This is for a horizontal scrolling scroll view.
// Let's say you want the same, to snap to every 160 pixels :

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
     int x = scrollView.contentOffset.x;
     int xOff = x % 160;
     if(xOff < 80)
          x -= xOff;
     else
          x += 160 - xOff;

     [scrollView setContentOffset:CGPointMake(x, scrollView.contentOffset.y) animated:YES];
}

1voto

Deniss Fedotovs Points 467

Swift 4.1, iOS11+ :

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    targetContentOffset.pointee = CGPoint(
        x: round(targetContentOffset.pointee.x / pageWidth) * pageWidth,
        y: targetContentOffset.pointee.y
    )
}

0voto

Sandro Meier Points 2540

J'ai eu le même problème il y a peu. Mon approche a été d'ajouter un deuxième UIScrollView à la scrollview. Vous pouvez donc passer à la page. Sur cette page, il semble que la page soit plus grande que l'écran. J'espère que cela fonctionne aussi dans votre situation ;-)

Sandro Meier

0voto

brad.roush Points 567

Cela semble fonctionner beaucoup mieux pour moi :

UIScrollView : pagination personnalisée

Ici, ils ajoutent la vue de défilement (en conservant son aspect de pagination) en tant que vue secondaire d'un ExtendedTouchView ou d'une sous-classe de UIVIew et écrasent la méthode de test d'accès.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
    if ([[self subviews] count] > 0) {
        //force return of first child, if exists
        return [[self subviews] objectAtIndex:0];
    } else {
        return self;
    }
}
return nil;
}

Cela a fait exactement ce que je voulais avec un minimum de code et de casse-tête.

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