我有一个包含大图像的UIScrollView,并使用分页在图像之间滚动。为了节省内存,我只在当前可见的图像之前和之后加载一个图像,并在滚动完成后加载/释放新图像。
如果快速滚动并且未调用scrollViewDidEndDecelerating
,则会出现问题。
如何检测连续滚动?
我可以检查每个scrollViewDidScroll
上的项目位置,但这看起来有点沉重......
答案 0 :(得分:2)
也许具有自定义单元格内容的表格视图对您来说效果更好,因为它内置了大量逻辑,仅用于加载可见的单元格,而不是一次加载所有内容。有很多关于如何以各种方式管理表视图的教程。
答案 1 :(得分:0)
我的临时解决方案是通过在用户抬起手指直到滚动完成时禁用滚动来取消连续滚动。
-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
[scrollView setScrollEnabled:NO];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[scrollView setScrollEnabled:YES];
}
答案 2 :(得分:0)
你可以做这样的事情
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 1.5) / pageWidth) + 1;
}
无论是否以编程方式更改contentoffset,都会调用此方法。
通过这种方法,您可以查看“页面”是否与当前页面相同,如果没有,您知道需要加载某些内容。这里的技巧是使图像加载而不会阻止滚动视图的滚动。这就是我被困住的地方。
当你到下一页的一半时,页面计算将变为下一个/上一个
答案 3 :(得分:0)
如果你还在寻找一个解决方案...这就是我所做的,它的表现也非常好。
- (void)scrollViewDidEndDragging:(UIScrollView *)sv willDecelerate:(BOOL)decelerate
{
if (!decelerate)
{
// load images and unload the ones that are not needed anymore
[self someMethod]
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv
{
// load images and unload the ones that are not needed anymore
[self someMethod]
}
答案 4 :(得分:0)
您必须同时检查scrollViewDidEndDecelerating和scrollViewDidScroll。 什么时候用户滑动和释放它让“动量”滚动第一个将在和调用。如果用户通过点击桌面视图决定用手指停止滚动(或滚动到最底部,但我不确定),则会触发第二个事件。
答案 5 :(得分:0)
根据我的经验,@ jd291是正确的;我在大多数地方成功使用以下回调
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
但是,唯一没有调用callback
的情况是您可能没有正确设置delegate
。
答案 6 :(得分:0)
2010年WWDC已经讨论过这个问题。他们重复使用子滚动视图,在 scrollViewDidScroll:中分配丢失的图像视图。视频可能有所帮助: