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() при переопределении в любом случае.