UICollectionView добавление изображения в ячейку

Я работаю над проектом, который использует UICollectionView для отображения данных, которые могут иметь или не иметь изображение.

способ, которым я использую, - проверить, не является ли url-адрес изображения нулевым, а затем добавить 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];
    }
}

для тех ячеек, которые не имеют изображения, ячейка должна выглядеть так: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/good.png

однако некоторые из них все равно добавят ImageView с обрезанным изображением на нем, вызывает что-то вроде этого: https://dl.dropboxusercontent.com/u/5753236/Stackoverflow/bad.png

Я пробовал использовать SDWebImage, но все еще не решил проблему.

другая проблема заключается в том, что когда я прокручиваю UICollectionView, Я бы увидел некоторые изображения, отображаемые как изображение, показанное выше, сначала, а затем изменить его правильное изображение после завершения загрузки, и я просто не знаю, что вызывает проблему.

пожалуйста, помогите мне разобраться эти две проблемы, я был бы очень признателен за любую помощь.

2 ответов


прежде всего, то, как вы добавляете изображения в свою ячейку, довольно опасно. Причина в том, что ваши ячейки используются повторно (например, при прокрутке или при перезагрузке), и эти изображения никогда не удаляются при повторном использовании. Таким образом, вы начнете видеть их повсюду, и вы даже можете добраться до точки, где ваша ячейка содержит несколько вхождений изображения. Вот два способа сделать это:--4-->

  • Первый способ (хороший способ): вы подкласс UICollectionViewCell, и дайте подклассу свойство "imageView". Затем вы делаете это в своем CustomCollectionViewCell.файл м :

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

    тогда в вашем ViewController вы должны объявить новый класс ваших collectionViewCells следующим образом:

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

    это гарантирует, что изображения будут правильно удалены при повторном использовании, а также проще настроить ячейку в делегате collectionView.

  • Второй способ (грязный способ), вы удаляете представления каждый раз при загрузке новая ячейка:

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

    этот способ намного проще, но я бы не рекомендовал его: P

Теперь попробуйте это и дайте мне знать, как развивается ваша ошибка.


код для Swift 4

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {   
    return 1   
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

    var imageview:UIImageView=UIImageView(frame: CGRect(x: 50, y: 50, width: 200, height: 200));

        var img : UIImage = UIImage(named:"Your image name")
        imageview.image = img

        cell.contentView.addSubview(imageview)

    }

    return cell
}

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: 50, height: 414)
}