2010-10-04 22 views
7

Tengo una aplicación basada en la muestra PageControl de Apple. La primera vez que se carga la vista, la vista de desplazamiento se carga con la página 0 y la página 1. ¿Cada vez que se inicia un desplazamiento, el método scrollViewDidScroll debería ser llamado por UIKit correctamente?Mi aplicación llama a scrollViewDidScroll 19 veces

Al iniciar un desplazamiento de la página 0 a la página 1, la aplicación debe cargar la página-1, la página y la página + 1, (para evitar destellos durante el desplazamiento).

Mi aplicación parece llamar a scrollViewDidScroll 19 veces y mi método loadScrollViewWithPage: 19 veces cada uno con la página 0 y la página 1, antes de que finalmente llegue a la página 1 y 2, y luego se cuelga.

Estos son los métodos:

- (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]; 
} 

¿Por qué te llaman scrollViewDidScroll tantas veces?

Gracias

Respuesta

24

scrollViewDidScroll: es llamado cada vez que el cambio de los límites de desplazamiento. Esto significa que se llama durante el desplazamiento, así como cuando se inicia. Es posible que desee probar scrollViewWillBeginDragging: en su lugar.

Cuestiones relacionadas