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
Réponses
Trop de publicités?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.
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];
}
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
)
}
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.