2014-07-24 31 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