【问题标题】:scrollViewDidEndDecelerating is not getting called没有调用 scrollViewDidEndDecelerating
【发布时间】:2011-03-17 12:53:27
【问题描述】:

我有一个包含大图像的 UIScrollView,并且正在使用分页在图像之间滚动。为了节省内存,我只在当前可见的图像之前和之后加载一张图像,并在滚动完成后加载/释放新图像。当快速滚动并且未调用 scrollViewDidEndDecelerating 时会出现问题。 当调用 scrollViewDidEndDecelerating 时,我想在活动页面中显示图像名称。

我该如何解决这个问题?为什么会发生这种情况?

【问题讨论】:

  • 如果你不改变偏移量,你是如何实现滚动的?我已经在不同的应用程序中多次执行此操作,您描述的所有内容都可以通过“正常”方法(scrollRectToVisible)实现,并且根据您想要实现的效果智能地启用/禁用动画部分。听起来你在这里做了一些非常不寻常的事情?
  • 你有任何答案我有同样的问题......

标签: iphone call uiscrollviewdelegate


【解决方案1】:

scrollViewDidEndDragging 将在每次滚动完成后调用

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{}

scrollViewDidEndDecelerating 不要在每次拖动时调用(如果你在拖动停止后不以加速速度拖动它不会永远调用这个函数)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}

scrollViewDidEndScrollingAnimation 如果你想移动滚动视图使用 api 而不是拖动,这个 api 将被调用。

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{}

【讨论】:

    【解决方案2】:

    我正在用滚动视图做同样的事情 - 延迟加载图像。实际上,我们必须加载一个被拉伸的缩略图(制作图像的模糊低分辨率版本),然后在页面实际 100% 显示在视图中时加载真实图像。

    我要做的是在 scrollViewDidScroll:scrollView 中使用以下代码。

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {    
        if (!_isCurrentlyRotating) {
            CGFloat pageWidth = _scrollView.frame.size.width;
            int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth)+1;
    
            if (_currentPage != page)
                [self setCurrentPage:page];
        }
    }
    

    上面计算了将要显示的页面(作为您的滚动)。当页面视图显示 50% 时,它实际上会更改当前页码。这可以与页面控件结合使用以突出显示当前页面点。

    使用上述方法,(在滚动视图上启用分页)当用户使用手指更改页面时(正常行为)scrollViewDidEndDecelerating:当页面 100% 显示时调用scrollView。 100% 我的意思是你只能看到一页而不是另一页的一部分。

    但我们在滚动视图的末尾有一个“重新开始”按钮,它调用我的 scrollToPage: 函数。

    - (void) scrollToPage:(int)page {
        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * page;
        frame.origin.y = 0;
        frame.size = self.scrollView.frame.size;
        [self.scrollView scrollRectToVisible:frame animated:YES];
    }
    

    使用 scrollRectToVisible:animated: 方法不会触发 scrollViewDidEndDecelerating: 方法,所以我只是添加了锐化方法(它只是在图像视图中加载高分辨率图像)调用这两个方法,以便在用户滚动时调用它或者如果按下重新开始按钮。

    - (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
        [self sharpenImageView];
    }
    
    - (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        [self sharpenImageView];
    }
    

    我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      检查您的 UIScrollView 的委托是否已设置,或者是否设置为 nil。

      一般这样设置scrollView.delegate = self

      【讨论】:

        【解决方案4】:

        scrollViewDidEndDecelerating: 并不是用来进行页面布局的。您应该实现scrollViewDidScroll: 并根据滚动视图的contentOffset 计算当前可见页面。如果可见范围已更改,请为以前不可见的页面添加视图并删除不再可见的页面。

        【讨论】:

        • 这并没有帮助我找到解决问题的方法。
        【解决方案5】:

        有时只需清理您的项目并重新运行

        Shift & Cmd & K Shift & Cmd & Alt & k

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-10
          • 1970-01-01
          • 2012-06-14
          • 2013-01-10
          • 2021-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多