使用Apple的PhotoScroller示例预加载其他图像

时间:2011-08-14 17:37:34

标签: iphone uiscrollview uiimageview

我正在尝试修改Apple的PhotoScroller示例,但我遇到了一个无法解决的问题。

基本上,PhotoScroller最初在本地将一堆图像加载到一个数组中。我尝试修改它并更改为从URL请求动态请求图像文件。用户滚动到下一页后,将从新网址中获取下一张图片。

为了提高性能,我想预先加载下一页,这样用户在滚动到下一页时无需等待下载图像。一旦下一页在当前页面上,之后的页面将被加载,依此类推......

我不太确定如何实现这一点,我希望有人能告诉我该怎么做。

这是我的自定义代码:(请参阅Apple的PhotoScroller示例中的完整代码)

tilePage方法:(每次用户滚动滚动视图时都会调用它)

- (void)tilePages 
{
// Calculate which pages are visible
CGRect visibleBounds = pagingScrollView.bounds;
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds));
int lastNeededPageIndex  = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds));
firstNeededPageIndex = MAX(firstNeededPageIndex, 0);
lastNeededPageIndex  = MIN(lastNeededPageIndex, [self imageCount] - 1);

// Recycle no-longer-visible pages 
for (ImageScrollView *page in visiblePages) {
    if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) {
        [recycledPages addObject:page];
        [page removeFromSuperview];
    }
}
[visiblePages minusSet:recycledPages];


// add missing pages
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) {


    if (![self isDisplayingPageForIndex:index]) {

        ImageScrollView *page = [self dequeueRecycledPage];
        //ImageScrollView *nextpage = [self dequeueRecycledPage];

        if (page == nil) {
            page = [[[ImageScrollView alloc] init] autorelease];
        }

        [self configurePage:page forIndex:index];
        [pagingScrollView addSubview:page];
        [visiblePages addObject:page];

    }
}   

}

配置页面索引和内容:

- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index
{   
//set page index
page.index = index;

//set page frame
page.frame = [self frameForPageAtIndex:index];

//Actual method to call image to display
[page displayImage:[self imageAtIndex:index]];  
NSLog(@"index: %i", index);
}

从网址获取图片:

- (UIImage *)imageAtIndex:(NSUInteger)index {

NSString *string1 = [NSString stringWithString:@"http://abc.com/00"];
NSString *string2 = [NSString stringWithFormat:@"%d",index+1];
NSString *string3 = [NSString stringWithString:@".jpg"];

NSString *finalString = [NSString stringWithFormat:@"%@%@%@",string1,string2,string3];
NSLog(@"final string is: %@", finalString);

NSURL *imgURL = [NSURL URLWithString: finalString];
NSData *imgData = [NSData dataWithContentsOfURL:imgURL];

return [UIImage imageWithData:imgData];

}

感谢您的帮助! 劳伦斯

1 个答案:

答案 0 :(得分:0)

您可以使用并发操作一个接一个地获取图像。使用NSOperations,您可以设置依赖关系链,以便在后台以串行方式加载图像,或者您可以同时下载所有图像。

大图像的问题在于,即使将它们保存在文件系统中,也会有“启动”时间来渲染图像。此外,在PhotoScroller中,Apple通过为每个细节级别预先平铺所有图像来“欺骗”。 Apple没有办法在PhotoScroller中只渲染普通的ole JPEG,所以除非你能预先贴上它,否则对你没用。

如果您感到好奇,可以通过仔细阅读github上的PhotoScrollerNetwork项目,了解如何下载多个图像并将它们预先平铺到临时文件中。