2014-07-24 34 views
5

我想從我的NSCollectionView得到類似惰性的行爲。 (老實說,我認爲它有,像一個UITableView - 看起來像一個明顯的遺漏?)NSCollectionView惰性加載類似的行爲

無論如何,我在單元格中顯示圖像,並希望加載圖像,因爲他們即將滾動到視圖,並卸載他們離開後。

這是一種研究工具,並不需要是相當 - 即:在東西可以「彈出」

任何想法?我的第一個想法是爲集合中的視圖找到某種方式來了解它們在屏幕上的時間,但是正確的調用似乎被調用了很多次,遠遠超過了屏幕上的視圖。

回答

7

正如您所提到的,NScollectionView一次構建所有單元格。特別是如果在單元內有很多圖像會導致性能問題。這是我解決問題的方法。可能有更好的解決方案,但只要這對我來說工作得很好。 很長時間以來,我一直在用Instruments觀察代碼的性能,並沒有發現任何缺陷。

- (void)windowDidLoad { 
    //Here adding observer to NSCollectionView's scrollview to monitor bounds changes. 
    NSView *contentView = [scrollViewOfYourCollectionView contentView]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boundDidChange:) name:NSViewBoundsDidChangeNotification object:contentView]; 
} 

- (void)boundDidChange:(NSNotification *)notification 
{ 
    NSRect collectionViewVisibleRect = yourCollectionView.visibleRect; 
    //collectionViewVisibleRect.size.height += 300; //If you want some preloading for lower cells... 

    for (int i = 0; i < yourDataSourceArray.count; i++) { 
     NSCollectionItem *item = [yourCollectionView itemAtIndex:i]; 
     if (NSPointInRect(NSMakePoint(item.view.frame.origin.x, item.view.frame.origin.y), collectionViewVisibleRect) == YES) 
     { 
      if (item.imageView.image == nil) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
       //Fill your cells. 
       //to showing/downloading images I am using SDWebImage. 
       }); 
      } 
     } 
    } 
} 
+0

謝謝,明天我會試試並報告回來!你覺得你需要做特別的事情來清理那些看不見的細胞嗎? – user441669

+0

這是我原來的計劃,但是一旦我看到它不影響我離開它的表現。如果你想清理它們,你可以將imageView圖像設置爲零,如果單元格不在可見矩形中。 – mohacs

+0

非常適合我,謝謝。 – user441669