В настоящее время я занимаюсь рефакторингом своего приложения Newsstand.
Ранее я показывал несколько пользовательских UIView
(«CoverView») в саморассчитываемой сетке (3 элемента в строке, столько строк, сколько необходимо), встроенной в представление прокрутки с вертикальной прокруткой.
Каждый «CoverView» состоит из
- ярлык (показывающий название проблемы)
- изображение (показывающее обложку выпуска)
- кнопка (показывающая "СКАЧАТЬ" или - если уже загружена - "ЧИТАТЬ")
- индикатор выполнения (изначально скрыт, показывает ход загрузки)
Каждый CoverView имеет свои собственные UITapGestureRecognizer
и UILongPressGestureRecognizer
.
Если пользователь нажимает один раз, кнопка скрывается, отображается индикатор выполнения загрузки, который постоянно обновляется в соответствии с ходом загрузки:
[issue addObserver:cover forKeyPath:@"downloadProgress" options:NSKeyValueObservingOptionNew context:NULL];
(Распознаватель длительного нажатия позволяет пользователю удалить проблему).
Все CoverView хранятся в NSMutableDictionary и всегда хранятся в памяти. Хотя немасштабированные изображения довольно большие (высота 1024 пикселя), у меня никогда не было проблем с производительностью при прокрутке, вероятно, потому, что не так много проблем (и, следовательно, CoverViews) для хранения.
Поскольку самореализованная сетка-макет сложна и сложна в обслуживании, я хотел вместо этого использовать UICollectionView
. Я добавил представление коллекции и сделал свой класс CoverView наследником UICollectionViewCell
(вместо UIView
).
Отображение и прокрутка работают, но у меня следующие проблемы:
Прокрутка отстает, когда необходимо отобразить новую строку ячеек, и для каждой вызывается collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath.
Я пытался не использовать повторно ячейки (как ни странно, для повышения производительности), но это не удалось из-за того, что для каждой ячейки должен быть установлен свой идентификатор повторного использования (а свойство "reuseIdentifier" доступно только для чтения, поэтому я не могу установить это в коде).
Я не знаю, где отключить обозреватели КВО для ячейки. Есть ли способ получать уведомления, когда ячейка ставится в очередь для повторного использования?
В общем, я не уверен, неправильно ли я использую UICollectionView
с моим конкретным вариантом использования и должен придерживаться моего предыдущего подхода, или это просто моя неспособность эффективно использовать и настраивать UICollectionView
.