iOS UIScrollView延迟加载

时间:2012-07-31 22:50:24

标签: iphone ios xcode uiscrollview lazy-loading

我只是想知道是否有人可以为我解释这个代码,所以我可以从中学习。我试图让我的应用程序有一个滚动从左到右滚动与大量的图片(从互联网)但事实是,它必须有延迟加载。所以我做了一些教程,并想出如何做到但我真的不理解它。所以我希望某种善良的灵魂能够解释如何逐步加载

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

-(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];
    }
}

}

3 个答案:

答案 0 :(得分:1)

关于在scrollView上加载延迟,我非常建议使用UITableView。 Apple在这个组件上的表现非常出色。

你可以让它们水平(见EasyTableView code,效果很好)并停止页面模式如果你想连续滚动(pagingEnabled = NO;)这样你就可以得到你的行为了寻找。

答案 1 :(得分:0)

延迟加载基本上只在您需要时才能获取大块数据(在本例中可以说是图像)。在您的代码中,您有一个在滚动UIScrollView时调用的委托方法。

- (void)scrollViewDidScroll:(UIScrollView *)myScrollView函数决定何时实际获取数据。因此,在滚动时,您会在滚动视图中找到自己的位置(假设您要加载10张图像 - 您想知道屏幕当前是否显示图像编号1,2,3等)。这就是currentPage整数所持有的。

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

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

上面的代码检查人物当前正在观看的图像之后的图像是否存在(因此当前页面+ 1)。如果确实如此,我们已经取出它并退出该功能。否则:

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

在这里,我们懒得加载图片。例如,这可以通过创建新线程并从服务器下载图像来完成。我们这样做的同时视图不是currentPage,因为我们不希望图像在用户滚动时“弹出”。我们添加图像的视图得到一个标记(UIView有一个“tag”属性);我们将标记设置为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];
    }
}

在这里,我们使用currentPage变量并通过我们设置的标记对它们进行索引来遍历所有视图。如果标签不是当前页面中的一个(请记住,我们不希望任何弹出!)我们将它从滚动视图中删除并释放一些内存。

希望有所帮助。

答案 2 :(得分:0)

也许这会对你有帮助。

  1. 从此处https://github.com/nicklockwood/AsyncImageView/下载异步ImageView文件,并将它们包含在您的项目中。

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

  3. 将此内容写入您的.h文件

    IBOutlet AsynchronousImageView * _artworkImg;

  4. 将此内容写入.m文件

    [_ artworkImg loadImageFromURLString:@“你的图片网址”];