我的应用调用 scrollViewDidScroll 19 次

Posted

技术标签:

【中文标题】我的应用调用 scrollViewDidScroll 19 次【英文标题】:My App calls scrollViewDidScroll 19 times 【发布时间】:2010-10-04 11:20:46 【问题描述】:

我有一个基于 Apple 的 PageControl 示例的应用程序。第一次加载视图时,滚动视图会加载第 0 页和第 1 页。每当启动滚动时,UIKit 应该调用 scrollViewDidScroll 方法对吗?

从第 0 页开始滚动到第 1 页时,应用应加载第 1 页、第 1 页和第 1 页,(以防止滚动时闪烁)。

我的应用程序似乎调用了 19 次 scrollViewDidScroll 和我的 loadScrollViewWithPage: 方法 19 次,每次调用第 0 页和第 1 页,然后它最终到达第 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 会被调用这么多次?

谢谢

【问题讨论】:

【参考方案1】:

scrollViewDidScroll: 每次滚动边界改变时都会被调用。这意味着它在滚动期间以及开始时被调用。您可能想改用scrollViewWillBeginDragging:

【讨论】:

这是个好主意。我还实现了scrollViewDidEndDragging 方法。我有一个变量可以让我知道拖动何时开始和结束。有了这个,我可以决定在scrollViewDidScroll 中加载的方法是否无限次调用:)

以上是关于我的应用调用 scrollViewDidScroll 19 次的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebView 中没有调用 scrollViewDidScroll

ScrollViewDelegate 不调用 scrollViewDidScroll 或 scrollViewWillBeginDragging

用奇怪的 contentOffsetY 调用 scrollViewDidScroll

UICollectionView 调用 scrollViewDidScroll:从导航堆栈中弹出时

scrollViewDidScroll 没有被调用(我设置了委托!)

scrollViewDidScroll 在上下滚动 tableview 时被调用 tablecell 内的 uiscrollview