2011-08-14 24 views
0

我試圖修改Apple的PhotoScroller示例,並且遇到了無法解決的問題。使用Apple的PhotoScroller示例預載入其他圖像

基本上,PhotoScroller最初在本地將一堆圖像加載到數組中。我試圖修改它,並更改爲從URL動態請求圖像文件。一旦用戶滾動到下一頁,它將從新URL獲取下一個圖像。

爲了提高性能,我想預加載下一頁,以便用戶在滾動到下一頁時不需要等待下載的圖像。一旦下一頁在當前頁面上,之後的頁面將被加載,等等......

我不太確定我該如何實現這一點,我希望有人能告訴我該怎麼做。

這裏是我的自定義代碼:(請參考蘋果的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); 
} 

從URL抓取圖像

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

} 

感謝您的幫助! Lawrence

回答

0

您可以使用併發操作一個接一個地獲取圖像。使用NSOperations,您可以設置依賴關係鏈,以便在後臺以串行方式加載圖像,或者可以同時下載所有圖像。

大圖像的問題在於,即使將它們保存在文件系統中,也存在「啓動」時間以獲取圖像。此外,在PhotoScroller中,Apple通過爲每個細節級別預先拼貼所有圖像來「欺騙」。蘋果公司沒有辦法在PhotoScroller中渲染一個普通的ole JPEG,所以除非你可以預先拼貼,否則對你來說是沒有用的。

如果你很好奇,你可以看看如何下載多個圖像,並通過閱讀github上的PhotoScrollerNetwork項目將它們預先放到臨時文件中。