2014-07-24 21 views
5

Próbuję uzyskać ładowanie podobnie jak zachowanie z mojego NSCollectionView. (Naprawdę założyłem, że to ma, jak UITableView - wydaje się oczywistym pominięciem?)NSCollectionView Lazy-loading jak zachowanie

W każdym razie, wyświetlam obrazy w komórkach, i chciałbym załadować obrazy, ponieważ są one do przewijania do widoku i rozładować po wyjściu.

To za narzędzie badawcze i nie musi być ładny - tzn rzeczy może „pop” w

Wszelkie pomysły.? Moja pierwsza myśl polega na znalezieniu sposobu, w jaki Widoki w kolekcji wiedzą, kiedy są na ekranie, ale rysowanie wydaje się być nazywane wiele razy, znacznie częściej niż na ekranie.

Odpowiedz

7

Jak wspomniano, NScollectionView buduje wszystkie komórki na raz. Zwłaszcza, jeśli w komórkach jest dużo obrazów, które powodują problemy z wydajnością. W ten sposób rozwiązuję problem. Mogą być lepsze rozwiązania, ale o ile to działa dobrze dla mnie. Od dłuższego czasu obserwuję działanie kodu z instrumentami i nie widzę żadnej wady.

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

Dziękuję, spróbuję tego jutro i zgłoś się ponownie! Czy uważasz, że musisz zrobić coś specjalnego, aby oczyścić komórki, które nie są widoczne? – user441669

+0

To był mój pierwotny plan, jednak gdy zobaczyłem, że to nie wpływa na wydajność, zostawiłem go. Jeśli chcesz je wyczyścić, możesz ustawić imageView image na zero, jeśli komórka jest niewidoczna. – mohacs

+0

Działa świetnie dla mnie, dziękuję. – user441669

Powiązane problemy