UICollectionView + SDWebImage + Cell重用

时间:2013-09-12 06:09:26

标签: ios objective-c uicollectionview sdwebimage

我有一个带有自定义UICollectionViewCell类的UICollectionView,它在其contentView中添加了另一个UIView(thumbnailView)。另一个视图有一个UIImageView属性(imageView),其图像异步加载SDWebImage。这一切都正常,直到原始单元格的图像仍在加载时重复使用单元格。如果您通过CollectionView图像滚动得足够快,则会在不应该出现的单元格中弹出(可能是因为单元格被重用并且图像下载完成后),只需在重复使用正确的图像后立即更换细胞装完。

要解决此问题,我将以下内容添加到我的UICollectionViewCell子类中以停止原始单元格的图像下载:

- (void)prepareForReuse
{
    [super prepareForReuse];
    [self.thumbnailView.imageView cancelCurrentImageLoad];
}

但令我惊讶的是,这似乎完全没有改变。我做错了什么,或者我只是朝错误的方向看?

5 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您将在重复使用的单元格中显示旧图像,因此除了停止先前的图像加载之外,您可能还想从imageView中删除旧图像。 SDImageView可能有清除图像的方法,否则您只需用占位符图像手动替换它。

- (void)prepareForReuse
{
    [super prepareForReuse];
    [self.thumbnailView.imageView cancelCurrentImageLoad];
    [self.thumbnailView.imageView setImage:<<LOCAL PLACEHOLDER IMAGE>> forState:UIControlStateNormal];
}

答案 1 :(得分:2)

UITableViewDelegateUICollectionViewDelegate方法-tableView:didEndDisplayingCell:forRowAtIndexPath:是更新UITableView |的最佳位置它后的UICollectionView个细胞消失了。您可以在那里取消单元格下载。

答案 2 :(得分:2)

Swift 4 - 添加到您的手机班级:

override func prepareForReuse() {
  super.prepareForReuse() 
  self.contentImageView.sd_cancelCurrentImageLoad()
  self.contentImageView.image = UIImage(named: "") // set to default/placeholder image
}

答案 3 :(得分:0)

我尝试了didEndDisplayCell()和prepareForReuse(),它们都不起作用。一种工作方式是将imageView.image设置为nil然后分配给特定图像,然后它不会将旧图像作为背景闪烁。 (但它会慢一点,因为它必须先做“干净”的工作)。

答案 4 :(得分:0)

SWIFT 4

在将新图片设置为imageView之前添加:

cell.imageView.sd_currentDownloadTask?.cancel()