2010-10-04 2 views
7

Ho un'app basata sull'esempio di PageControl di Apple. La prima volta che viene caricata la vista, la vista di scorrimento viene caricata con la pagina 0 e la pagina 1. Ogni volta che si avvia una scroll, il metodo scrollViewDidScroll deve essere richiamato da UIKit corretto?La mia app chiama scrollViewDidScroll 19 volte

Quando si avvia uno scorrimento dalla pagina 0 alla pagina 1, l'applicazione deve caricare pagina 1, pagina e pagina + 1, (per evitare lampi durante lo scorrimento).

La mia app sembra chiamare scrollViewDidScroll 19 volte e il mio metodo loadScrollViewWithPage: 19 volte ciascuno con la pagina 0 e la pagina 1, prima che arrivi finalmente alle pagine 1 e 2, quindi si blocca.

Questi sono i metodi:

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    NSLog(@"scrollviewdidscroll"); 
    // We don't want a "feedback loop" between the UIPageControl and the scroll delegate in 
    // which a scroll event generated from the user hitting the page control triggers updates from 
    // the delegate method. We use a boolean to disable the delegate logic when the page control is used. 
    if (pageControlUsed) { 
     // do nothing - the scroll was initiated from the page control, not the user dragging 
     return; 
    } 

    // Switch the indicator when more than 50% of the previous/next page is visible 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1; 
    pageControl.currentPage = page; 

    // load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling) 
    [self loadScrollViewWithPage:page - 1]; 
    [self loadScrollViewWithPage:page]; 
    [self loadScrollViewWithPage:page + 1]; 

    // A possible optimization would be to unload the views+controllers which are no longer visible 
} 

- (void)loadScrollViewWithPage:(int)page { 
    if (page < 0) return; 
    if (page >= kNumberOfPages) return; 

    NSLog(@"page: %i", page); 

    // replace the placeholder if necessary 
    KeyboardViewController *controller = [viewControllers objectAtIndex:page]; 
    if ((NSNull *)controller == [NSNull null]) { 
     controller = [[KeyboardViewController alloc] initWithPageNumber:page]; 
     [viewControllers replaceObjectAtIndex:page withObject:controller]; 
     [controller release]; 
    } 

    // add the controller's view to the scroll view 
    CGRect frame = scrollView.frame; 
    frame.origin.x = frame.size.width * page; 
    frame.origin.y = 0; 
    frame.size.height = scrollView.frame.size.height; 
    controller.view.frame = frame; 
    [scrollView setAutoresizesSubviews:YES]; 
    [scrollView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; 
    [scrollView addSubview:controller.view]; 
} 

Perché scrollViewDidScroll ottenere chiamato così tante volte?

Grazie

risposta

24

scrollViewDidScroll: viene chiamato ogni volta che il cambiamento limiti di scorrimento. Ciò significa che viene richiamato durante lo scorrimento, così come quando inizia. Si consiglia di provare scrollViewWillBeginDragging: invece.