web-dev-qa-db-fra.com

Comment puis-je rendre uiscrollview infinie sous iOS?

Je veux faire défiler comme ça 1 2 3 1 2 3

J'ai quelques boutons supposons 10 que je veux montrer sur le défilement sans fin.

 numbercolors=[[NSMutableArray alloc] init];

 //total count of array is  49 

 numbercolors = [NSMutableArray arrayWithObjects:@"25",@"26",@"27",@"28",@"29",@"31",@"32",@"33",@"34",@"35", @"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23",@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",@"32",@"33",@"34",@"35", @"0",@"1",@"2",@"3",nil];

  int x=2500;

for (NSInteger index = 0; index < [numbercolors count]; index++)
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    button.frame = CGRectMake(x ,0,29.0,77.0);

    button.tag = index;

    [button setTitle:[numbercolors objectAtIndex:index] forState:UIControlStateNormal];

    [button addTarget:self action:@selector(didTapButton:) 

    forControlEvents:UIControlEventTouchUpInside];

    [coloringScroll addSubview:button];

    x=x+70+29;
}
 [coloringScroll setContentSize:CGSizeMake(5000+ (29+70)*[numbercolors count], 1)];

 [coloringScroll setContentOffset:CGPointMake(2500+(29+70)*11, 0)];

Ceci est mon code pour make butttons sur scrollview.

Comment puis-je définir dans - (void) scrollViewDidEndDecelerating: (UIScrollView *) envoie cette méthode pour un défilement infini.

13
virantporwal

Il suffit juste de définir le nombre setContentOffset

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.x > 2500+(29+70)*4 + ((29+70)*36)) {
        [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x-((29+70)*36),  0)];  
    }
    if (scrollView.contentOffset.x < 2500+(29+70)*4){
       [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x+((29+70)*36), 0)];
    }
}
8
virantporwal

L'idée principale est de repositionner votre défilement sur une valeur constante, une fois cette valeur défilée, puis de repositionner automatiquement vos éléments "1", "2", "3".

Par exemple - Vous devriez avoir scrollview avec contentwidth 5000. Par défaut, vous le définissez sur la position 2500.

alors il vous suffit de cocher - (void)scrollViewDidCScroll:(UIScrollView *)scrollview - si scrollview.contentoffset.x> 3500 - puis diminuez sa position pour scrollview.contentoffset.x - = 1000;

et la même chose de l'autre côté. Cela entraînera un défilement infini.

Mais le contenu ne suivra pas. So - Vous devez implémenter une vérification supplémentaire de la valeur de décalage du contenu pour réorganiser et repositionner correctement les éléments "1", "2", "3".

J'utilise habituellement 3 éléments, puis je précharge dynamiquement l'image de galerie nécessaire pour eux.

Si vous ne voulez pas réinventer la "roue", consultez ces solutions:

https://www.cocoacontrols.com/controls/dmcircularscrollview

https://www.cocoacontrols.com/controls/infinitescrollview

https://www.cocoacontrols.com/controls/iainfinitegridview

6
Guntis Treulands

Vous pouvez consulter cette solution basée sur le code exemple Apple StreetScroller iOS:

https://github.com/gblancogarcia/GBInfiniteScrollView

J'espère que ça aide!

J'ai écrit une sous-classe infinie à défilement UIscrollView qui accomplit cette tâche. Il est basé sur l'exemple Apple StreetScroller. Vous fournissez simplement les titres de vos boutons et indiquez si vous souhaitez un défilement horizontal ou vertical. Vous pouvez également définir de nombreuses autres options. Il est posté avec de la documentation et un exemple de projet sur mon github. Voici le lien...

http://github.com/ninefifteen/SSRollingButtonScrollView

2
ninefifteen

C'est une vieille question, mais j'écris ceci pour aider qui cherche la même solution. Supposons que nous souhaitons parcourir en boucle 3 éléments (cellules) - C0, C1, C2, nous pouvons générer des cellules factices à gauche et à droite des cellules centrales, le résultat étant le suivant

C0 C1 C2 [C0 C1 C2] C0 C1 C2

Les cellules entre parenthèses sont des cellules que nous voyons à travers l'écran de l'appareil, et si nous faisons défiler vers la gauche,

C0 [C1 C2 C0] C1 C2 C0 C1 C2

à ce moment, force contentOffset à pointer du côté droit de cellules factices données,

C0 [C1 C2 C0] C1 C2 C0 C1 C2 -> C0 C1 C2 C0 [C1 C2 C0] C1 C2

Comme la mise en œuvre transparente de cette tâche prend beaucoup de temps, je recommande ma solution ci-dessous.

https://github.com/DragonCherry/HFSwipeView

Si vous voulez juste vérifier son fonctionnement, cliquez sur le lien ci-dessous et "tapez pour jouer".

https://www.cocoacontrols.com/controls/hfswipeview

1
DragonCherry

Pour un défilement infini à droite, vous pouvez utiliser - 

        let rightOffset = CGPoint.init(x: (scrollView.contentSize.width) - (scrollView.bounds.width), y: 0)
    UIView.animate(withDuration: 3.0,
                   delay: 0.0,
                   options: [.curveLinear, .repeat],
                   animations: { () -> Void in
                    self.scrollView.contentOffset = rightOffset

    }, completion: { (finished: Bool) -> Void in
        self.scrollView.setContentOffset(.init(x: 0, y: self.scrollView.contentOffset.y), animated: false)
    })
0
neeraj singla

J'ai implémenté un scroller infini dans Swift.
Il s’inspire de Apple StreetScroller example

Je sais que ce n'est pas encore parfait, mais je pense que c'est un bon point de départ.

InfiniteVerticalScroller

0
Luca Davanzo