2013-09-12 3 views
1

У меня есть UICollectionView с пользовательским классом UICollectionViewCell, который добавляет еще один UIView (thumbnailView) в свой контентный просмотр. Это другое представление имеет свойство UIImageView (imageView), изображение которого загружается с помощью SDWebImage асинхронно. Все это работает нормально, пока ячейка не будет повторно использована, пока изображение исходной ячейки все еще загружается. Если вы прокрутите достаточно быстро через изображения CollectionView, начните появляться в ячейках, где они не должны быть (вероятно, потому, что ячейка повторно используется и загрузка изображений заканчивается впоследствии), просто чтобы ее заменили, как только правильное изображение для повторного использования Ячейка заканчивает загрузку.UICollectionView + SDWebImage + Повторное использование ячеек

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

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

Но к моему удивлению, это, кажется, не менять абсолютно ничего. Я что-то делаю неправильно, или я просто смотрю в неправильном направлении?

ответ

2

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

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

UITableViewDelegate и UICollectionViewDelegate метод -tableView:didEndDisplayingCell:forRowAtIndexPath: является лучшим местом, чтобы обновить UITableView | UICollectionView после того, как он исчез. Вы можете отменить загрузку ячеек.

0

Я пробовал оба didEndDisplayCell() и prepareForReuse(), ни один из них не работает. Круглый путь состоит в том, чтобы установить imageView.image как ноль, затем назначить конкретное изображение, затем оно не будет моргнуть старое изображение в качестве фона. (но он будет медленнее, поскольку он должен сначала выполнить «чистую» работу).

0

Swift 4 - добавить класс вашей клетки:

override func prepareForReuse() { 
    super.prepareForReuse() 
    self.contentImageView.sd_cancelCurrentImageLoad() 
    self.contentImageView.image = UIImage(named: "") // set to default/placeholder image 
} 
Смежные вопросы