2013-10-12 20 views
7

У меня есть UICollectionView, где я показываю сетку изображений, загруженных из Интернета. Для загрузки изображений используется SDWebImage. Проблема, с которой я сталкиваюсь, заключается в том, что когда я просматриваю UICollectionView, иногда клетки повторяются, отображая одно и то же изображение. Но когда ячейка прокручивается вне поля зрения, а затем возвращается, она имеет правильный набор изображений.UICollectionView повторяет ячейку

-(UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    NSString *CellIdentifier = @"Gallery_Cell"; 

    GalleryCell *cell; 

    if (cell==nil) { 
     cell= (GalleryCell *)[self.flowCollection dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

     ImageItem *dets = [self.imageList objectAtIndex:indexPath.row]; 

     NSURL *mainImageURL = [NSURL URLWithString:dets.smallImageURL]; 

     cell.image.contentMode = UIViewContentModeScaleAspectFill; 
     cell.image.clipsToBounds = YES;     

     [cell.image setImageWithURL:mainImageURL placeholderImage:nil]; 

    } 

    return cell; 

} 

Это случилось с кем-то еще? Был бы очень признателен за любые указатели.

ответ

0

Я закончил использование метода «didEndDisplayingCell» UICollectionView и прекратил текущую загрузку изображения и установил изображение на нуль. Это сработало отлично, и больше не было «перетасовки» или повторения изображений! :)

5

В «Справочнике классов UICollectionView» указано следующее: « Если вы зарегистрировали класс для указанного идентификатора и создать новую ячейку, этот метод инициализирует ячейку, вызывая ее метод initWithFrame: для nib- основанные на ядре, этот метод загружает объект ячейки из предоставленного файла nib. Если существующая ячейка была доступна для повторного использования, этот метод вызывает метод prepareForReuse ячейки вместо этого. "

У вас есть метод prepareForReuse для вашего класса CellCellCell?

Ваш класс ячейки должен быть подклассом класса UICollectionReusableView. И проверьте это.

+0

Я попытался очистить значение изображения UIImageView в методе prepareForReuse. Но повторение все же происходит. :( –

+0

Что нужно сделать в makeForReuse? –

0

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

Быстрое решение (возможно) для обеспечения того, чтобы setImageWithURL звонил с изображением заполнителя. Я не знаю библиотеку SDImage, но хорошо догадаться, что она сразу же устанавливает образ imageView на образ заполнителя, если он предоставлен.

Если у вас нет или нет изображения с заполнителем, вы можете реализовать prepareForReuse в своем подклассе UICollectionViewCell и очистить изображение.

+0

Я попытался очистить значение изображения UIImageView в методе prepareForReuse. Но повторение все еще происходит. :( –

+0

Нужно больше подсказок. Попробуйте изображение с заполнителем, переданное setImageWithURL, также посмотрите, как изменяется поведение. – danh

+0

Пробовал тоже. –

7

На GalleryCell.m вам нужно добавить prepareForReuse метод и там уничтожаем _image переменной (при условии, что у вас есть image @property в клетке):

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    [self setHighlighted:NO]; 

    _image = nil; 
} 
1
-(UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

NSString *CellIdentifier = @"Gallery_Cell"; 

GalleryCell *cell; 

if (cell==nil) { 
    cell= (GalleryCell *)[self.flowCollection dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

    ImageItem *dets = [self.imageList objectAtIndex:indexPath.row]; 

    NSURL *mainImageURL = [NSURL URLWithString:dets.smallImageURL]; 

    [cell.image setImage:[UIImage new]]; 

    cell.image.contentMode = UIViewContentModeScaleAspectFill; 
    cell.image.clipsToBounds = YES;     

    [cell.image setImageWithURL:mainImageURL placeholderImage:nil]; 

} 

return cell; 

} 
1

использовать этот метод это определенно Вл работайте 100%.

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    GalleryCell *cell1 = (GalleryCell*)[_resumeCollectionView cellForItemAtIndexPath:indexPath]; 
    cell1= nil; 

} 
Смежные вопросы