scrollViewDidEndDecelerating没有被调用

问题描述 投票:2回答:5

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

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

iphone call uiscrollviewdelegate
5个回答
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%时,它将实际更改当前页码。可以将其与页面控件结合使用以突出显示当前页面点。

使用以上内容,(当在滚动视图上启用分页时)当用户使用手指更改页面时(正常行为),当页面显示为100%时,将调用scrollViewDidEndDecelerating: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:方法,因此我只是向这两种方法中添加了Sharpen方法(该方法只是在图像视图中加载高分辨率图像)调用,以便在用户滚动或滚动时调用该方法。如果按下重新开始按钮。

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

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

我希望这会有所帮助!


0
投票

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

Shift&Cmd&KShift&Cmd&Alt&k


0
投票

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

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

scrollViewDidEndDecelerating不要在每次拖动中调用(如果您在拖动停止后不以acce速度拖动,它将永远不会调用此函数)

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

scrollViewDidEndScrollingAnimation,如果要移动滚动视图,请使用不带拖动功能的api,此api将被调用。

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

0
投票

检查UIScrollView的代表是否已设置,或设置为nil。

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.