Я добавил этот UICollectionViewDelegate с моей реализацией:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
SAPCollectionViewCell *collectionViewCell = (SAPCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"SAPCollectionViewCell" forIndexPath:indexPath];
NSInteger index = indexPath.item + indexPath.section * 2;
NSString *imagePath = [_images objectAtIndex:index];
collectionViewCell.index = index;
[collectionViewCell setImageWithPath:imagePath];
collectionViewCell.delegateCell = self;
return collectionViewCell;
}
В моей пользовательской ячейке у меня есть этот метод:
- (void)setImageWithPath:(NSString *)imagePath
{
if (!self.imageView)
{
CGRect rect = self.contentView.frame;
self.imageView = [[UIImageView alloc] initWithFrame:rect];
[self.contentView addSubview:self.imageView];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *image = [UIImage imageFromPath:imagePath];
UIImage *resizedImage = [UIImage imageWithImage:image scaledToWidth:rect.size.width];
dispatch_async(dispatch_get_main_queue(), ^{
[self.imageView setImage:resizedImage];
});
});
}
}
Итак, как вы можете видеть, если в ячейке нет UIImageView, я начинаю ее создавать, а в фоновом режиме я получаю изображение по локальному пути и изменяю его размер до ширины просмотра содержимого ячейки, затем в основной очереди я устанавливаю изображение в UIImageView.
Эта часть работает хорошо, но когда я пытаюсь прокрутить свой UICollectionView, например. с 10 изображениями я заметил, что, например, если первые 2 верхних изображения исчезли, когда я прокручиваю вниз, а затем, когда я прокручиваю обратно вверх, изображения меняются местами.
Это состояние изображений перед прокруткой вниз:
И это состояние после того, как я прокрутил UIColectionView
обратно наверх:
Итак, как вы можете видеть, сначала предмет изменил свое местоположение. Поскольку я установил if (!self.imageView)
в своем коде выше, это должно означать, что изображение никогда не будет создано дважды или более раз.
Я открыл отладчик и проверял этот метод:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
Таким образом, пути изображений возвращались один за другим, как это работало, когда UICollectionView только что создавал ячейки в первый раз.
В первый раз первый UICollectionViewCell имеет адрес 0x8fbc1d0, а второй имеет адрес 0x8d0a4c0.
Но когда я прокручиваю вниз, а затем прокручиваю вверх, отладчик сначала показывает мне второй адрес 0x8d0a4c0, а затем показывает мне 0x8fbc1d0.
Но я не могу понять, почему элементы меняют свой порядок. А может здесь дело в другом?
Также у меня нет никакого метода в коде, который, например, для меня переупорядочивает ячейку. всего несколько методов представления UICollection делегируют, которые настраивают количество ячеек и создают их.
Также, если я удаляю if (!self.imageView)
, кажется, что все работает хорошо, но тогда мой код каждый раз вызывает диспетчеризацию, что мне не подходит, потому что, когда я изменяю размер изображения до размера ячейки, мне не нужно делать это дважды.