2013-03-14 1 views
0

J'ai un scrollView et j'en ai besoin pour faire défiler très lentement jusqu'à la fin, tout seul, et quand l'utilisateur touche la vue, il devrait répondre aux gestes (en haut). avec cela je dois mettre un bouton qui arrête/joue le défilement automatique.xcode comment puis-je faire un défilement défilement très lentement à la fin sans interaction de l'utilisateur?

le code:

self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
self.scrollView.contentSize = CGSizeMake(320,4750); 
_scrollView.frame = CGRectMake(0, 44, 320, 420); 

UIButton *camilaButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[camilaButton setImage:[UIImage imageNamed:@"camila.jpg"] forState:UIControlStateNormal]; 
[camilaButton setImage:[UIImage imageNamed:@"camila.jpg"] forState:UIControlStateHighlighted]; 
camilaButton.frame = CGRectMake(20, 10, 280, 200); 

[self.scrollView addSubview:camilaButton]; 
[camilaButton addTarget:self action:@selector(onButtonPressCamila) forControlEvents:UIControlEventTouchUpInside]; 

UILabel *camilaLabel = [[UILabel alloc] initWithFrame:CGRectMake(40,220,100,30)]; 
camilaLabel.text = @"Camila"; 
[self.scrollView addSubview:camilaLabel]; 

... et puis il y a des boutons similaires avec des images ci-dessous pour la fin de la scrollview.

comment puis-je faire cela?

Mihai

Répondre

0

ce code adapté a fait le tour (chaque image est de 280 par 200):

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

UIScrollView *scr=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
scr.tag = 1; 
scr.autoresizingMask=UIViewAutoresizingNone; 
[self.view addSubview:scr]; 
[self setupScrollView:scr]; 
UIPageControl *pgCtr = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 264, 480, 36)]; 
[pgCtr setTag:12]; 
pgCtr.numberOfPages=10; 
pgCtr.autoresizingMask=UIViewAutoresizingNone; 
[self.view addSubview:pgCtr]; 
} 

    - (void)setupScrollView:(UIScrollView*)scrMain { 
// we have 10 images here. 
// we will add all images into a scrollView & set the appropriate size. 

for (int i=1; i<=10; i++) { 
    // create image 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"sti%02i.jpg",i]]; 
    // create imageView 
    UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(20, ((i-1)*scrMain.frame.size.height+100), 280, 200)]; 
    // set scale to fill 
    imgV.contentMode=UIViewContentModeScaleToFill; 
    // set image 
    [imgV setImage:image]; 
    // apply tag to access in future 
    imgV.tag=i+1; 
    // add to scrollView 
    [scrMain addSubview:imgV]; 
} 
// set the content size to 10 image width 
[scrMain setContentSize:CGSizeMake(scrMain.frame.size.width, scrMain.frame.size.height*10)]; 
// enable timer after each 2 seconds for scrolling. 
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(scrollingTimer) userInfo:nil repeats:YES]; 


} 

- (void)scrollingTimer { 
// access the scroll view with the tag 
UIScrollView *scrMain = (UIScrollView*) [self.view viewWithTag:1]; 
// same way, access pagecontroll access 
UIPageControl *pgCtr = (UIPageControl*) [self.view viewWithTag:12]; 
// get the current offset (which page is being displayed) 
CGFloat contentOffset = scrMain.contentOffset.y; 
// calculate next page to display 
int nextPage = (int)(contentOffset/scrMain.frame.size.height) + 1 ; 
// if page is not 10, display it 
if(nextPage!=10) { 


    [scrMain scrollRectToVisible:CGRectMake(0, nextPage*scrMain.frame.size.height, scrMain.frame.size.width, scrMain.frame.size.height) animated:YES]; 
    pgCtr.currentPage=nextPage; 
    // else start sliding form 1 :) 


} else { 

    [scrMain scrollRectToVisible:CGRectMake(0, 0, scrMain.frame.size.width, scrMain.frame.size.height) animated:YES]; 
    pgCtr.currentPage=0; 
} 
} 
1

Faire une minuterie qui appellera périodiquement ce point de vue méthode tableau

[tableView scrollRowToVisible:nextRow++]; 

nextRow peut être une propriété NSInteger ou une variable globale/statique.

+0

merci beaucoup Anoop! – Mihai

+0

Quelle réponse a fonctionné pour vous? veuillez accepter cela afin que les autres puissent savoir comment résoudre ce problème. –

+0

probablement toutes vos réponses sont ok; Je suis une recrue et je n'ai pas pu les tester tous. J'ai trouvé un autre code qui m'a été plus facile à implémenter. – Mihai

1
- (void) animateScroll:(NSTimer *)timerParam 
{ 
    const NSTimeInterval duration = 10.2; 

    NSTimeInterval timeRunning = -[startTime timeIntervalSinceNow]; 

    if (timeRunning >= duration) 
    { 
     [scrollView setContentOffset:destinationOffset animated:YES]; 
     [timer invalidate]; 
     timer = nil; 
     return; 
    } 
    CGPoint offset = [scrollView contentOffset]; 
    offset.y = startOffset.y + (destinationOffset.y - startOffset.y) * timeRunning/duration; 
    [scrollView setContentOffset:offset animated:YES]; 
} 

- (void) doAnimatedScrollTo:(CGPoint)offset 
{ 
    self.startTime = [NSDate date]; 
    startOffset = scrollView.contentOffset; 
    destinationOffset = offset; 

    if (!timer) 
    { 
     self.timer = 
     [NSTimer scheduledTimerWithTimeInterval:0.01 
       target:self 
       selector:@selector(animateScroll:) 
       userInfo:nil 
       repeats:YES]; 
    } 
} 
+0

merci beaucoup David! – Mihai

2

Peut-être la façon la plus simple de le faire est de faire défiler juste d'un point à sans animation:

CGPoint theScrollPoint; 
theScrollPoint.x = 0; 
theScrollPoint.y = (nRegion * self.tableView.rowHeight) + 
dblPctIntoRegion * (self.tableView.rowHeight); 
[self.tableView setContentOffset: theScrollPoint animated:FALSE]; 

Si vous pouvez obtenir ce à environ point à point (et vous a dit lentement) il sera assez lisse et évitera le mal de tête de manipuler un utilisateur défilant manuellement pendant une animation. Si vous décidez d'animer votre défilement programmatique, sachez qu'il existe des moyens par l'intermédiaire d'un utilisateur de faire défiler le défilement pendant que vous essayez de faire défiler par programme, etc., que vous pouvez vous retrouver dans scrollViewDidEndScrollingAnimation. Je devais recourir à la bidouille:

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
    if(!m_bNoReentrantscroll) 
    { 
    m_bNoReentrantscroll = TRUE; 
    } 
    m_bNoReentrantscroll = FALSE; 
} 

Quoi qu'il en soit, il est tout plus délicat qu'il n'y paraît quand vous le tester en profondeur. Je recommande de renoncer à l'animation sur les parchemins!

+0

merci beaucoup Wilson! – Mihai

Questions connexes