5

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

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

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

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

4

5 回答 5

4

Swift 4 - 添加到你的单元格的类:

override func prepareForReuse() {
  super.prepareForReuse() 
  self.contentImageView.sd_cancelCurrentImageLoad()
  self.contentImageView.image = UIImage(named: "") // set to default/placeholder image
}
于 2018-02-19T12:35:10.793 回答
3

如果我正确理解了您的问题,那么旧图像仍会出现在重复使用的单元格中,因此除了停止先前的图像加载之外,您可能还想从 imageView 中删除旧图像。SDImageView 可能有一种清除图像的方法,否则您可以手动将其替换为占位符图像。

- (void)prepareForReuse
{
    [super prepareForReuse];
    [self.thumbnailView.imageView cancelCurrentImageLoad];
    [self.thumbnailView.imageView setImage:<<LOCAL PLACEHOLDER IMAGE>> forState:UIControlStateNormal];
}
于 2013-09-12T09:16:44.973 回答
2

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

于 2013-09-30T19:30:02.687 回答
2

斯威夫特 4

在设置要imageView添加的新图像之前:

cell.imageView.sd_currentDownloadTask?.cancel()
于 2018-04-26T17:41:11.420 回答
0

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

于 2015-10-05T20:23:06.790 回答