2011-10-30 52 views
3

在我的服務器上,每個圖像有三個文件。three20圖庫如何加載圖像?

  • 縮略圖文件,它是由128
  • 一個小文件,其餘方面適合的160最大由240
  • 大型文件裁剪爲128,這是我方面擬合到960最大由540

我返回這些網址的three20的畫廊方法是這樣的:

- (NSString*)URLForVersion:(TTPhotoVersion)version { 
    switch (version) { 
     case TTPhotoVersionLarge: 
      return _urlLarge; 
     case TTPhotoVersionMedium: 
      return _urlSmall; 
     case TTPhotoVersionSmall: 
      return _urlSmall; 
     case TTPhotoVersionThumbnail: 
      return _urlThumb; 
     default: 
      return nil; 
    } 
} 

已經登錄後磨片ñ這些不同的值被調用時,會發生以下情況:

  1. 當縮略圖頁面加載,只有縮略圖被稱爲(預期)
  2. 當圖像被點擊時,會出現縮略圖,而不是小的圖像。
  3. 似乎縮略圖之後,大的圖像被直接加載(沒有被顯示的小圖像)。

我希望發生的是以下

  1. 這是相同的(如預期的主網頁縮略圖加載)
  2. 當圖像被挖,小圖像加載第一
  3. 然後,加載大圖像。

或者,下面

  1. 縮略圖
  2. 直接到大的圖像。

拇指的問題是,我裁剪它,所以它是一個正方形。

這意味着,當被顯示在主瀏覽器的縮略圖圖像(拇指被竊聽後),它是過大,並且當大圖像加載時,它立即按比例縮小,以適應。

這看起來非常糟糕,而對我來說,它將使更爲明智,如果它裝載在縮略圖視圖的大拇指,然後將小圖像,然後在詳細視圖的大圖片。

有沒有人對如何解決這一問題有什麼建議?
簡單地使拇指具有相同的寬高比是最好的方法嗎?

我希望在這個問題上

回答

1

望着three20來源的任何意見,我可以看到,使用下面的邏輯TTPhotoView加載預覽圖像:

- (BOOL)loadPreview:(BOOL)fromNetwork { 
    if (![self loadVersion:TTPhotoVersionLarge fromNetwork:NO]) { 
    if (![self loadVersion:TTPhotoVersionSmall fromNetwork:NO]) { 
     if (![self loadVersion:TTPhotoVersionThumbnail fromNetwork:fromNetwork]) { 
     return NO; 
     } 
    } 
    } 
    return YES; 
} 

的問題是,因爲你的小圖片在服務器上,而不是在本地代碼中跳過圖像並使用縮略圖進行預覽。

我建議您最好的解決方案是編輯縮略圖,以便它們具有與大圖像相同的縱橫比。這就是這個班級的開發人員所期望的!

+0

您是否認爲(如果這是可能的話),在網絡/速度方面,強制three20在點擊時加載小圖像是有意義的,然後是大? –

+0

我認爲這背後的想法是,如果你已經有本地的大或小版本,將它們用作預覽是有意義的,但是如果你先下載小圖片然後大。如果縮略圖顯示爲佔位符並且對用戶也應該感覺快(尤其是如果圖像的大小相同),則該過程將更快。 – Grouchal

0

我認爲你有三種方式可以去這裏:

  1. 修改從TTPhotoView實際loadPreview實現,以便它實現你想要的(即,允許裝載來自網絡的小版本)的邏輯;

  2. 小類TTPhotoView並且覆蓋loadPreview以達到與上述相同的效果;

  3. 預緩存您的照片的小版本;即修改/子類TTThumbView,以便當TTPhotoVersionThumbnail被設置時,它預緩存TTPhotoVersionSmall版本;在這種情況下,作爲本地已經存在的圖像,loadPreview將發現它而不需要爲網絡出去;另外,您可以隨時在您認爲適合您的應用程序的地方進行預緩存;預先緩存圖像,您將創建一個TTButton與正確的URL(這將爲您處理TTURLRequest和緩存);

  4. 否則,您可以使用此UIImage category從小版本到縮略圖版本即時進行裁剪;在這種情況下,您還應該調整TTThumbView的方式,方法是覆蓋imageForCurrentState方法,以便在必要時應用裁剪。再次,要麼你直接修改TTThumbView或你的子類;或者,你可以在你的照片視圖控制器定義layoutSubviews和修改有每個TTThumbView的你得了:

    - (void)layoutSubviews { 
        [super layoutSubviews]; 
        for (NSInteger i = 0; i < _thumbViews.count; ++i) { 
         TTThumbView* tv = [_thumbViews objectAtIndex:i]; 
         [tv contentForCurrentState].image = <cropped image>; 
    

如果你不喜歡使用私有方法contentForCurrentState,你可以簡單地做:

  [tv addSubview:<cropped image>]; 

正如你所看到的,每個選項都有其優點和缺點; 1和2是最容易實現的,但小版本將從網絡加載,因此可能會增加一些延遲;這同樣適用於4,儘管方法不同; 3爲您提供了最快速響應的實現(自從您預緩存以來,沒有來自網絡的額外延遲),但它可能是實現最複雜的解決方案(您可以下載映像並自行緩存它,也可以使用TTButton來執行此操作你,這是不是很「乾淨」)。

無論如何,希望它有幫助。