2

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

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

4

5 回答 5

1

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

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

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

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

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

-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{}
于 2017-10-17T14:57:33.760 回答
0

我用滚动视图做同样的事情 - 延迟加载图像。我们实际上必须加载一个被拉伸的缩略图(制作一个模糊的低分辨率版本的图像),然后在页面实际 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:scrollView 在页面显示为 100% 时被调用。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];
}

我希望这有帮助!

于 2012-01-19T21:10:58.260 回答
0

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

通常以这种方式设置scrollView.delegate = self

于 2019-02-25T04:45:17.073 回答
-1

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

于 2011-07-18T00:49:13.363 回答
-1

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

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

于 2017-01-03T11:38:11.053 回答