UICollectionView показывает неправильные ячейки после прокрутки - проблема с вопросом?

У меня есть UICollectionView в UIViewController. В методе collectionView cellForItemAtIndexPath: он создает серию пользовательских ячеек на основе источника данных. Пользовательские ячейки, в свою очередь, содержат UIView, подклассифицированные для рисования отдельных страниц PDF.

Он настроен таким образом, чтобы разделить PDF файл на отдельные страницы, поэтому ячейка 1 содержит PDF-страницу 1, ячейка 2 содержит страницу PDF 2 и т.д. Пока все хорошо, вот моя проблема:

Когда я прокручиваю вниз, UICollectionView начинает отображать неправильные ячейки. Например, в 34-страничном документе он отображает ячейки/страницы 1-16 в правильном порядке, но затем начинает отображать страницы, которые, казалось, были отложены еще дальше, например, ячейка 1, ячейка 2, ячейка 4. Я никогда не получаю нигде рядом с ячейкой/стр. 34.

Я видел подобное поведение в UITableView в прошлом и считаю, что он имеет какое-то отношение к деинкретизации ячеек или методу делегата. Не совсем уверен - любая помощь приветствуется.

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

//create custom cell
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath];

//set file name (always the same; one PDF file)
cell.fileName = fileName;
cell.backgroundColor = [UIColor clearColor];

//set the title to the page number
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]];

//set the current page (which indicates which page to display) according to the pageCount
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue];

return cell; }

Ответы

Ответ 1

У меня были проблемы с similare. Это, скорее всего, потому, что повторно используемые ячейки не перерисовывают себя. В пользовательском классе контент (ваш просмотр в формате PDF) триггерная перерисовка, если кадр обновлен:

-(void)setFrame:(CGRect)frame {
    [super setFrame:frame];
    [self setNeedsDisplay]; // force drawRect:
}

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

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

во время инициализации.

Ответ 2

Исправлена ​​аналогичная проблема с использованием метода prepareForReuse

просто добавьте этот метод в свою собственную реализацию ячеек

- (void)prepareForReuse {

     self.fileName = nil;
     self.title = nil;

     // add remaining properties 

}

Ответ 3

Я установил аналогичную проблему в быстром, основанном на ответе Асатура Галстяна.

После объединения пользовательского класса в ячейку в раскадровке функция prepareForReuse() может быть переопределена:

import UIKit

class SomeCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var exampleView: UIView!
    @IBOutlet weak var exampleLabel: UILabel!

    override func prepareForReuse(){
        super.prepareForReuse()
        exampleLabel.textColor = nil
        exampleView.backgroundColor = nil
        exampleView.layer.cornerRadius = 0
    }
}

По умолчанию реализация prepareForReuse() ничего не делает (по крайней мере, в iOS 10), но Apple рекомендует вызывать super.prepareForReuse() при переопределении в любом случае.