2014-05-22 14 views
8

Pracuję nad projektem, który używa UICollectionView do wyświetlania danych, które mogą lub nie mają obrazu.UICollectionView Dodawanie obrazu do komórki

Sposób, w jaki używam, to sprawdzenie, czy adres URL obrazu nie jest pusty, a następnie dodanie do komórki ImageView.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (question.picture != (id)[NSNull null]) { 
     //add AsyncImageView to cell 
     imageView.contentMode = UIViewContentModeScaleAspectFill; 
     imageView.clipsToBounds = YES; 
     imageView.tag = IMAGE_VIEW_TAG; 
     [cell addSubview:imageView]; 
     [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView]; 
     imageView.imageURL = [NSURL URLWithString:question.picture]; 
    } 
} 

Dla tych komórek, które nie mają wizerunek, komórka powinna wyglądać następująco: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/good.png

Jednak niektóre z nich jeszcze doda się ImageView z przyciętego obrazu na nim, powodując coś takiego: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/bad.png

Próbowałem używać SDWebImage, ale nadal nie rozwiązuje problemu.

Innym problemem jest to, że kiedy przewijam w dół UICollectionView, zobaczyłabym niektóre obrazy wyświetlane jako obraz pokazany powyżej, a następnie zmienia się na prawidłowy obraz po zakończeniu ładowania, a ja po prostu nie mam pojęcia, co jest przyczyną problem.

Pomóż mi rozwiązać te dwa problemy, naprawdę byłbym wdzięczny za każdą pomoc.

+0

Twoje linki są złe – bunkerdive

Odpowiedz

13

Po pierwsze, sposób dodawania zdjęć w komórce jest dość niebezpieczny. Powodem jest to, że twoje komórki są ponownie wykorzystywane (na przykład podczas przewijania lub ponownego ładowania danych), a te obrazy nigdy nie są usuwane po ponownym użyciu. Więc zaczniesz je wszędzie widzieć, a nawet dojdziesz do punktu, w którym twoja komórka zawiera wiele wystąpień obrazu. Oto dwa sposoby, aby to zrobić:

  • Pierwszy sposób (dobry sposób): Ty podklasy swoją UICollectionViewCell i dać się „podklasy ImageView” własność. Wtedy to zrobić w pliku CustomCollectionViewCell.m:

    // Lazy loading of the imageView 
    - (UIImageView *) imageView 
    { 
        if (!_imageView) { 
         _imageView = [[UIImageView alloc] initWithFrame:self.contentView.bounds]; 
         [self.contentView addSubview:_imageView]; 
        } 
        return _imageView; 
    } 
    
    // Here we remove all the custom stuff that we added to our subclassed cell 
    -(void)prepareForReuse 
    { 
        [super prepareForReuse]; 
    
        [self.imageView removeFromSuperview]; 
        self.imageView = nil; 
    } 
    

    następnie w ViewController swój zadeklarować nową klasę swojego collectionViewCells tak:

    [self.collectionView registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; 
    

    Zapewni to, że zdjęcia są prawidłowo usunięto przy ponownym użyciu, a ponadto łatwiej jest skonfigurować komórkę w kolekcji delegata.

  • Drugi sposób (Brudna droga), usunąć poglądy za każdym razem ładować nową komórkę:

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView     cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
        for (UIView *subview in [cell.contentView subviews]) { 
         [subview removeFromSuperview]; 
        } 
    
        if (question.picture != (id)[NSNull null]) { 
         //add AsyncImageView to cell 
         imageView.contentMode = UIViewContentModeScaleAspectFill; 
         imageView.clipsToBounds = YES; 
         imageView.tag = IMAGE_VIEW_TAG; 
         [cell.contentView addSubview:imageView]; 
         [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView]; 
         imageView.imageURL = [NSURL URLWithString:question.picture]; 
        } 
    } 
    

    ten sposób jest o wiele łatwiej, ale nie polecam go: P

Spróbuj teraz i daj mi znać, jak zmienia się twój błąd.

+0

Dziękuję bardzo! Pierwsze oferowane rozwiązanie naprawdę działa i rozwiązuje wszystko. Dziękuję Ci! :) – Thomas

+0

Cieszę się, że mogę pomóc;) – Kujey

Powiązane problemy