2010-05-05 9 views
3

J'ai utilisé la méthode setContentOffset pour faire défiler un point particulier automatiquement sans intervention de l'utilisateur.autoscrolling pour UIScrollView

[menuScrollView setContentOffset:CGPointMake(600.0,0) animated:YES] 

mais quand je tente d'appeler la même méthode d'une manière en boucle afinde pour ralentir la vitesse de défilement du défilement ne se produit jamais

for (int i = 1; i<=30; i++) { 
     [menuScrollView setContentOffset:CGPointMake(600.0-i*10,0.0) animated:YES]; 
     NSLog(@"%f",600.0-i*10);   
    } 

Au cours de la pièce au-dessus du code, le défilement de UIScrollView arrive une seule fois (1ère itération (et il ne défile pas pour rester 29 itérations. Quel est le problème ici?

Répondre

6

Je pense que quand il est dans une boucle comme celui-ci, l'interface utilisateur ne sera pas mis à jour.

Essayez d'utiliser un NSTimer au lieu de le placer dans une boucle serrée comme celle-ci.

scrollTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(scrollView) userInfo:nil repeats:YES]; 

- (void) scrollView { 
    CGFloat currentOffset = menuScrollView.contentOffset.x; 
    CGFloat newOffset = currentOffset - 10; 
    [menuScrollView setContentOffset:CGPointMake(newOffset,0.0) animated:YES]; 
} 

Note: cela vient du haut de ma tête, donc je ne garantis pas que ça marchera.

+0

grâce cela a fonctionné. Mais existe-t-il un autre moyen de faire en sorte que le parchemin soit similaire au texte défilant en HTML? celui-ci est lent mais je peux sentir que le déplacement n'est pas à une vitesse constante. J'ai essayé cela en diminuant l'intervalle de temps mais ça ne semble pas très bien, ça ressemble à une sorte de tremblement dans les deux directions. Comment réparer ça? ou y a-t-il un autre moyen de résoudre le problème de sélection? – thndrkiss

+0

J'ai réduit l'intervalle de temps jusqu'à 0,01 seconde; Cela produit un défilement régulier sur un iPad 3. Si vous l'avez essayé sur un appareil 2010, il pourrait ne pas avoir la puissance de traitement pour le faire en douceur. Une autre option consiste à définir le décalage de contenu à la fin de la vue de contenu, à l'intérieur d'un bloc d'animation. Cela a produit un défilement très doux pour moi. Cependant, avec cette méthode, il n'est pas possible d'obtenir la position de défilement actuelle pendant l'exécution de l'animation, car la position de défilement est réellement définie à la position finale, malgré ce que vous voyez à l'écran pendant l'animation. – arlomedia

1

enter image description here Voici le code qui défilent automatiquement UIScrollView avec effet marquee: -

![CGFloat cx1; 
    int h=0; 
    int z=0; 
    int x=1; 
    bool isdragging=false; 


- (void)setupHorizontalScrollView : (UIScrollView *)scrollView 
{ 

    if (arrTopFive.count == 0) { 
     return; 
    } 

    for(UIView *subview in \[scrollView subviews\]) { 
     \[subview removeFromSuperview\]; 
    } 

    scrollView.delegate = self; 

    \[scrollView setBackgroundColor:\[UIColor clearColor\]\]; 
    \[scrollView setCanCancelContentTouches:NO\]; 

// scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
    scrollView.clipsToBounds = NO; 
    scrollView.scrollEnabled = YES; 




    CGFloat cx = 0; 
    for (int i = 0;i<arrTopFive.count;i++) 
    { 

     clsShows *c=\[arrTopFive objectAtIndex:i\]; 

     UIImageView *imageView = \[\[UIImageView alloc\] init\]; 
     imageView.userInteractionEnabled=YES; 

     UITapGestureRecognizer *tapGesture = \[\[UITapGestureRecognizer alloc\] initWithTarget:self action:@selector(tvShowTopFiveClicked:)\]; 
     tapGesture.numberOfTapsRequired = 1; 
     \[imageView addGestureRecognizer:tapGesture\]; 
     imageView.tag=i; 

     \[imageView sd_setImageWithURL:\[NSURL URLWithString:c.imageurl\] placeholderImage:\[UIImage imageNamed:@"img_placeholder.jpg"\]\]; 

     CGRect rect = imageView.frame; 
     rect.size.height = 250; 
     rect.size.width = 500; 
     rect.origin.x = cx; 
     rect.origin.y = 0; 

     imageView.frame = rect; 

     \[scrollView addSubview:imageView\]; 

     cx += imageView.frame.size.width+5; 

    } 

    \[scrollView setContentSize:CGSizeMake(cx, \[scrollView bounds\].size.height)\]; 
    cx1=cx-\[scrollView bounds\].size.width; 


    \[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(onTimer) userInfo:nil repeats:YES\]; 
} 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    if (scrollView.dragging) { 
     isdragging=true; 
     h=ceil((float)scrollView.contentOffset.x/5) * 5; 
     z=ceil((float)scrollView.contentOffset.x/5) * 5; 
     if (h<0) { 
      h=0; 
      z=0; 

     } 
     else if (h>cx1){ 
      h=cx1; 
      z=cx1; 
     } 

     \[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startScroller) object:nil\]; 
     \[self performSelector:@selector(startScroller) withObject:nil afterDelay:2.0\]; 

    } 
} 
-(void) startScroller{ 
    if (isdragging == true) { 
     isdragging=false; 
    } 
} 

- (void) onTimer { 

    if (isdragging) { 
     return; 
    } 

    if (h > cx1) { 

     if (x <= 5){ 
      \[headerView.scrollView setContentOffset:CGPointMake(z, 0) animated:YES\]; 
      x++; 
      z--; 
      return; 
     } 

     if (z <= 5){ 
      h=0; 
     } 
     z-=5; 

     \[headerView.scrollView setContentOffset:CGPointMake(z, 0) animated:YES\]; 
    } 
    else{ 
     x=1; 
     if (z<=5) { 
      \[headerView.scrollView setContentOffset:CGPointMake(h, 0) animated:YES\]; 
      z+=1; 
     } 
     else{ 
      h += 5; 
      z=h; 
      \[headerView.scrollView setContentOffset:CGPointMake(h, 0) animated:YES\]; 
     } 

    } 
}][1]