2010-10-04 26 views
7

Tôi có một ứng dụng dựa trên mẫu PageControl của Apple. Lần đầu tiên khung nhìn tải, khung nhìn cuộn được nạp với trang 0 và trang 1. Bất cứ khi nào một cuộn được bắt đầu, phương thức scrollViewDidScroll sẽ được UIKit gọi đúng?Cuộc gọi ứng dụng của tôi scrollViewDidScroll 19 lần

Khi bắt đầu cuộn từ trang 0 đến trang 1, ứng dụng sẽ tải trang-1, trang và trang + 1, (để tránh nhấp nháy trong khi cuộn).

Ứng dụng của tôi có vẻ gọi scrollViewDidScroll 19 lần và phương pháp loadScrollViewWithPage: của chúng tôi 19 lần với trang 0 và trang 1, trước khi trang đó đến trang 1 và 2, sau đó nó đổ vỡ.

Đây là những phương pháp:

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

Tại sao scrollViewDidScroll được gọi rất nhiều lần?

Cảm ơn

Trả lời

24

scrollViewDidScroll: được gọi mỗi khi thay đổi giới hạn cuộn. Điều này có nghĩa là nó được gọi trong khi cuộn, cũng như khi nó bắt đầu. Thay vào đó, bạn có thể thử dùng thử số scrollViewWillBeginDragging:.

Các vấn đề liên quan