Images in the collectionView are changing while scrolling

时间:2017-06-12 16:55:18

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

I am working in xcode 8.3. I have a CollectionView. I have downloaded images from web sevice and placed the images in each CollectionView cells. But when i scrolling the CollectionView, images in the each cells are changing. After a few minutes it shows the correct image. I have tried many solutions available in stackoverflow. But i didnt get a solution. Please help me.

5 个答案:

答案 0 :(得分:4)

就像其他人最有可能说的那样,因为你正在将可重复使用的单元格(正如你应该)出列并将cell.imageView.image属性设置为你的网络图像。

这里的问题是因为iOS通过"重用"来节省内存。这些细胞,它们在记忆中确实是相同的细胞。因此它滚动屏幕的一个边缘并消失。当新单元格滚动而不是创建一个新的单独单元格时,它只使用它刚刚离开屏幕的那个单元格。这意味着您的旧图像仍然是单元格中显示的图像。

标准做法是使用cellForRowAtIndexPath:方法设置单元格的内容。但是,如果您将其设置为异步获取的图像,则可能(可能)在获取新图像之前,单元格与旧图像一起显示在屏幕上。据推测,一旦下载了图像,它就不再是一个问题,因为它们应该立即从缓存中返回。

这里的简单修复是在每次在单元格中设置图像之前将图像取出,或者最好使用占位符图像。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL_IDENTIFIER" forIndexPath:indexPath];

    // This will clear any existing image from the cell about to be displayed it is an option
    //[cell.imageView setImage:nil];

    if (ImageExistsLocally)
    {
        cell.imageView.image = [UIImage imageWithContentsOfFile:@"SomeImagePath"];
    } 
    else 
    {
        [cell.cellImageView sd_setImageWithURL:yourRemoteImage.thumbnailUrl
                              placeholderImage:[UIImage imageNamed:PlaceHolderImageName]
                                     completed:nil];
    }
    return cell;
}

请注意sd_setImageWithURL来自SDWebImage库,我想其他人在这里提到过。 https://cocoapods.org/pods/SDWebImage

答案 1 :(得分:1)

这是因为重复使用细胞。尝试重置单元类prepareForReuse方法中的图像

-(void)prepareForReuse {
    [super prepareForReuse];
    self.imageView.image = nil;
}

答案 2 :(得分:1)

您遇到的问题是由于重用UITableViewCell。 如果您使用AlamofireImageSDWebImage从网络服务下载图片。它会处理你的问题。

答案 3 :(得分:0)

UICollectionView重复使用相同的UICollectionViewCell来提高效果。只有UICollectionViewCell内的数据发生了更改,因此在使用UICollectionViewCell之前,必须清除UICollectionViewCell之前的数据。 Cocoa Framework提供了UICollectionViewCell中存在的方法,该方法每次重复使用UICollectionViewCell时都会触发。

只需覆盖自定义UICollectionViewCell类文件<。p>的.m文件中的下面给出的函数

-(void)prepareForReuse {
    [super prepareForReuse];
// here we clear the previously set data
    self.imageView.image = nil; // this will clear the previously set imageView is a property of UIImageView used to display a image data
}

答案 4 :(得分:0)

您可以使用prepareForReuse()方法来处理此问题。

override func prepareForReuse() {
    super.prepareForReuse()

    // still visible on screen (window's view hierarchy)
    if self.window != nil { return }

    imageView.image = nil
}

注意:如果您使用的是SDWebImage,则应添加此行以取消当前的单元格图像下载。

imageView.sd_cancelCurrentAnimationImagesLoad()