iOS UIScrollView延迟加载

我只是想知道如果有人能为我解释这个代码,所以我可以从中学习。 我试图让我的应用程序有一个滚动左右滚动图片负载(从互联网),但事情是,它必须有延迟加载。 所以我做了一些教程,并想出如何做到这一点,但我真的不明白这一点。 所以我希望有一种灵魂会解释如何一步一步的懒惰负载

这是我从教程中学到的代码:

-(void)scrollViewDidScroll:(UIScrollView *)myScrollView { /** * calculate the current page that is shown * you can also use myScrollview.frame.size.height if your image is the exact size of your scrollview */ int currentPage = (myScrollView.contentOffset.y / currentImageSize.height); // display the image and maybe +/-1 for a smoother scrolling // but be sure to check if the image already exists, you can do this very easily using tags if ( [myScrollView viewWithTag:(currentPage +1)] ) { return; } else { // view is missing, create it and set its tag to currentPage+1 } /** * using your paging numbers as tag, you can also clean the UIScrollView * from no longer needed views to get your memory back * remove all image views except -1 and +1 of the currently drawn page */ for ( int i = 0; i < currentPages; i++ ) { if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] ) { [[myScrollView viewWithTag:(i+1)] removeFromSuperview]; } } 

}

关于在scrollView上的延迟加载,我会build议使用UITableView来代替。 苹果公司在这个组件上的performance非常出色。

你可以让它们水平(见这个EasyTableView代码 ,它工作的很好),并停止页面模式,如果你想连续滚动(pagingEnabled = NO;),所以你将能够得到你正在寻找的行为。

延迟加载基本上只在你需要的时候获取大量的数据(在这个例子中可以说是图像)。 在你的代码中,当你滚动一个UIScrollView的时候,你有一个委托方法。

– (void)scrollViewDidScroll:(UIScrollView *)myScrollView函数决定何时实际获取数据。 所以当你滚动的时候,你会发现你在滚动视图中的位置(比方说你有10个图像要加载 – 你想知道屏幕当前是否显示图像编号1,2,3)等。 这是currentPage的整数。

现在你知道你正在看哪个页面,我们想要实际获取图像。

 if ( [myScrollView viewWithTag:(currentPage +1)] ) { return; } 

上面的代码检查人物当前正在看的图像之后是否存在图像(因此是当前页面+1)。 如果是这样,我们已经提取了它,我们退出了这个function。 除此以外:

 else { // view is missing, create it and set its tag to currentPage+1 } 

在这里,我们懒加载图像。 例如,通过创build一个新的线程并从服务器上下载图像来完成。 我们这样做,而视图不是当前的页面,因为我们不希望图像在用户滚动时“popup”。 我们添加图像的视图得到一个标签(UIView有一个“标签”属性); 我们将标签设置为currentPage + 1,后者允许我们索引视图以防万一需要。

最后,我们有:

 /** * using your paging numbers as tag, you can also clean the UIScrollView * from no longer needed views to get your memory back * remove all image views except -1 and +1 of the currently drawn page */ for ( int i = 0; i < currentPages; i++ ) { if ( (i < (currentPage-1) || i > (currentPage+1)) && [myScrollView viewWithTag:(i+1)] ) { [[myScrollView viewWithTag:(i+1)] removeFromSuperview]; } } 

在这里,我们使用currentPagevariables,并通过我们设置的标签对它们进行索引来遍历所有的视图。 如果标签不是当前页面中的一个(记住,我们不想要任何popup!),我们将它从scrollview中移除并释放一些内存。

希望有所帮助。

也许这会帮助你。

  1. 从这里下载asynchronousImageView文件https://github.com/nicklockwood/AsyncImageView/并将它们包括到您的项目中&#x3002;

  2. 在xib文件上拖动ImageView,并将其类改为AsynchronousImageView而不是UIImageView

  3. 把这个写在你的.h文件里

    IBOutlet AsynchronousImageView * _artworkImg;

  4. 写在你的.m文件中

    [_artworkImg loadImageFromURLString:@“Your Image Url”];