2010-10-04 6 views
7

मेरे पास ऐप्पल के पेज कंट्रोल नमूने के आधार पर एक ऐप है। पहली बार दृश्य लोड होने पर, स्क्रॉल व्यू पृष्ठ 0 और पृष्ठ 1 के साथ लोड होता है। जब भी कोई स्क्रॉल शुरू किया जाता है, तो scrollViewDidScroll विधि को UIKit द्वारा सही कहा जाना चाहिए?मेरा ऐप scrollViewDidScroll को कॉल करता है 19 बार

पृष्ठ 0 से पृष्ठ 1 तक स्क्रॉल शुरू करते समय, ऐप को पृष्ठ -1, पृष्ठ और पृष्ठ + 1 लोड करना चाहिए, (स्क्रॉलिंग के दौरान चमक को रोकने के लिए)।

मेरा ऐप scrollViewDidScroll 1 9 बार औरविधि पृष्ठ 1 और पेज 1 के साथ 1 9 बार प्रत्येक बार कॉल करता है, इससे पहले कि यह पृष्ठ 1 और 2 तक पहुंच जाए, तो यह क्रैश हो जाता है।

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

क्यों scrollViewDidScroll बुलाया जायेगा तो कई बार:

इन विधियों कर रहे हैं?

धन्यवाद

उत्तर

24

scrollViewDidScroll: हर बार स्क्रॉल सीमा परिवर्तन कहा जाता हो जाता है। इसका मतलब यह है कि स्क्रॉल के दौरान, साथ ही जब यह शुरू होता है। आप इसके बजाय scrollViewWillBeginDragging: आज़मा सकते हैं।