2012-05-14 66 views
2

我想實現一個應用程序使用帶分頁的UIScrollView,類似於蘋果的天氣應用程序。需求加載UIScrollView

但是我對性能有點擔心。我一直在使用的示例實現加載所有視圖,然後應用程序啓動。在某個點之後,一旦證明這個速度很慢?

我不知道蘋果的相機膠捲是如何處理這個的,用戶可能有100多張照片可以滾動瀏覽。我是否應該嘗試找出僅在需要時才構建視圖的方法?或者也許有一種方法可以從UITableView複製出隊可重用單元技術,僅用於水平視圖加載,因爲每個視圖都具有相同的佈局。

+0

這個問題解決了嗎? – heckman

回答

4

到目前爲止,最有效的解決方案(也用於許多照片瀏覽應用程序,例如Facebook,也可能是本地的Photos應用程序)將按照UITableView的要求來加載內容。蘋果的StreetScroller示例項目應該能讓你走上正軌。

+1

我模擬了我在頁面控制演示上的實現http://developer.apple.com/library/ios/#samplecode/PageControl/Introduction/Intro.html –

4

一個非常有效的解決方案是確保儘可能重用任何視圖。如果您只是簡單地顯示圖像,則可以使用UIScrollView的子類,並在layoutSubviews中佈置這些可重用的視圖。在這裏,您可以檢測哪些視圖可見並且不可見,並根據需要創建子視圖。

一個例子離隊功能可能看起來像:

- (UIImageView *)dequeueReusableTileWithFrame:(CGRect) frame andImage:(UIImage *) image 
{ 
    UIImageView *tile = [reusableTiles anyObject]; 
    if (tile) { 
     [reusableTiles removeObject:tile]; 
     tile.frame = frame; 
    } 
    else { 
     tile = [[UIImageView alloc] initWithFrame:frame]; 
    } 
    tile.image = image; 
    return tile; 
} 

哪裏reusableTiles只是的NSMutableSet類型的伊娃。然後,您可以使用它來加載抓取任何當前離屏圖像視圖,並快速輕鬆地將它們帶回到視圖中。

你layoutSubviews可能看起來像:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    CGRect visibleBounds = [self bounds]; 
    CGPoint contentArea = [self contentOffset]; 

    //recycle all tiles that are not visible 
    for (GSVLineTileView *tile in [self subviews]) { 

     if (! CGRectIntersectsRect([tile frame], visibleBounds)) { 
      [reusableTiles addObject:tile]; 
      [tile removeFromSuperview]; 
     } 
    } 


    int col = firstVisibleColumn = floorf(CGRectGetMinX(visibleBounds)/tileSize.width); 
    lastVisibleColumn = floorf(CGRectGetMaxX(visibleBounds)/tileSize.width) ; 
    int row = firstVisibleRow = floorf(CGRectGetMinY(visibleBounds)/tileSize.height); 
    lastVisibleRow = floorf(CGRectGetMaxY(visibleBounds)/tileSize.height); 


    while(row <= lastVisibleRow) 
    { 
     col = firstVisibleColumn; 
     while (col <= lastVisibleColumn) 
     { 
      if(row < firstDisplayedRow || row > lastDisplayedRow || col < firstDisplayedColumn || col >lastDisplayedColumn) 
      { 

       UImageView* tile = [self dequeueReusableTileWithFrame:CGRectMake(tileSize.width*col, tileSize.height*row, tileSize.width, tileSize.height) andImage:YourImage]; 
       [self addSubview:tile]; 
      } 
      ++col; 
     } 
     ++row; 
    } 

    firstDisplayedColumn = firstVisibleColumn; 
    lastDisplayedColumn = lastVisibleColumn; 
    firstDisplayedRow = firstVisibleRow; 
    lastDisplayedRow = lastVisibleRow; 
} 

我用類似這樣的瓷磚東西,當我與一個非常大面積的滾動視圖的工作線的區域,它似乎相當工作好。對不起,我更新此圖像視圖而不是自定義tileView類時可能會創建任何拼寫錯誤。