UICollectionView переупорядочивает ячейки после прокрутки

Я добавил этот 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), кажется, что все работает хорошо, но тогда мой код каждый раз вызывает диспетчеризацию, что мне не подходит, потому что, когда я изменяю размер изображения до размера ячейки, мне не нужно делать это дважды.


person Matrosov Alexander    schedule 04.09.2014    source источник


Ответы (1)


Когда вы прокручиваете два элемента за пределы экрана, ваш CollectionView помещает связанные ячейки обратно в «очередь». Когда вы снова прокручиваете вверх, dequeueResuableCellwithReuseIdentifier в cellForItemAtIndexPath извлекает их из этой очереди, но (как вы видели) не обязательно в том же порядке. Таким образом, ячейка, которая была элементом 0, использовалась для элемента 1 и наоборот. Как вы видели, if (!self.imageView) фактически останавливает загрузку правильного изображения. Если вы хотите избежать их извлечения и изменения размера каждый раз, я бы сохранил (измененные) изображения в массиве.

person pbasdf    schedule 04.09.2014