2014-05-22 32 views
8

Bir görüntüye sahip olabilecek veya olmayan bir görüntüyü görüntülemek için UICollectionView kullanan bir proje üzerinde çalışıyorum.UICollectionView bir hücreye görüntü eklenmesi

Kullandığım yol, resim URL'sinin boş olup olmadığını kontrol etmektir, ardından hücreye bir ImageView ekleyin. Hiçbir görüntü var bu hücreler için

- (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]; 
    } 
} 

, hücre gibi görünmelidir: Ancak https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/good.png

, bazıları hala böyle bir şeye neden, üzerinde kırpılan görüntü ile bir ImageView katacak: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/bad.png

SDWebImage'ı kullanmayı denedim, ancak yine de sorunu çözmüyorum.

Diğer sorun, UICollectionView'u aşağı kaydırdığımda, ilk önce yukarıda gösterilen görüntü olarak görüntülenen bazı resimlerin göründüğünü ve yükleme tamamlandıktan sonra doğru görüntünün değiştirileceğini ve yalnızca neden olduğunu bilmiyorum. sorun.

Lütfen bu iki sorunu çözmeme yardım edin, herhangi bir yardım için gerçekten minnettarım.

+0

Bağlantıların kötü – bunkerdive

cevap

13

Her şeyden önce, hücrenize görüntü eklediğiniz şekil oldukça tehlikelidir. Bunun nedeni, hücrelerinizin yeniden kullanılmasıdır (kaydırma yaptığınızda veya yeniden yüklediğinizde örnek olarak) ve bu görüntüler hiçbir zaman yeniden kullanımda kaldırılmaz. Böylece onları her yerde görmeye başlayacaksınız ve hatta hücrenizin görüntünün birden fazla oluşumunu içerdiği noktaya bile gelebilirsiniz.

  • İlk yol (iyi bir şekilde): İşte bunu yapmak için iki yol vardır Sen UICollectionViewCell alt sınıf ve alt sınıf bir "imageview" özelliğini verir. Sonra da CustomCollectionViewCell.m dosyasında bu yapın:

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

    Bu görüntüleri doğru olmasını sağlayacaktır:

    // 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; 
    } 
    

    Sonra ViewController içinde senin bu gibi collectionViewCells yeni sınıf bildirmek zorunda Yeniden kullanımda kaldırıldı, ayrıca koleksiyonunuzuViewView temsilcisine yerleştirmek çok daha kolay.

  • İkinci yolu (kirli yön), sen incelemeler her zaman kaldırmak, yeni bir hücreyi yüklemek:

    - (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]; 
        } 
    } 
    

    Bu şekilde çok daha kolay ama bunu tavsiye etmem: P

Şimdi bunu deneyin ve hatanın nasıl geliştiğini bana bildirin.

+0

Çok teşekkür ederim! Sunulan ilk çözüm gerçekten işe yarıyor ve herşeyi çözüyor. Teşekkür ederim! :) – Thomas

+0

Sevindim;) – Kujey