Я пытаюсь создать представление, отображающее даты всех дней недели в одной строке с включенной горизонтальной прокруткой и нумерацией страниц. Как и в приложении календаря iPhone, одна полная неделя должна быть видна сразу.
Для этого я создал collectionView и настроил его для отображения этих семи элементов. Когда пользователь прокручивает влево (чтобы увидеть следующую неделю), вызывается функция collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)
. Здесь я добавляю следующие элементы и перезагружаю collectionView.:
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if indexPath.item > numberofitems - 10 {
numberofitems += 15
DispatchQueue.main.async {
self.myCollectionView.reloadData()
}
}
Затем collectionView перезагружается:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! myCollectionViewCell
dayComponent.day = -3 * 7 - Calendar.current.component(.weekday, from: Date()) + indexPath.item + 1 + indecesadded
cell.setup(date: Calendar.current.date(byAdding: dayComponent, to: Date())!)
}
Это, кажется, работает очень хорошо.
Однако Что мне также нужно, так это возможность прокрутки в другом направлении (назад) и добавления новых ячеек перед видимыми. Я попытался использовать тот же метод и добавить contentOffset:
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if indexPath.item < 10 {
numberofitems += 14
indecesadded += 14
DispatchQueue.main.async {
self.myCollectionView.reloadData()
self.myyCollectionView.setContentOffset(CGPoint(x: self.myCollectionView.contentOffset.x + 2 * self.view.bounds.width, y: 0), animated: false)
}
}
}
Проблема в том, что после добавления новых ячеек (средняя прокрутка) прокрутка резко останавливается. Когда я снова начинаю прокручивать вручную, кажется, что подкачка отключена, а это означает, что последний день одной недели не соответствует первому дню следующей - 1. (см. Изображения ниже).
перед прокруткой на предыдущая неделя:
после прокрутки:
после ручной прокрутки коллекции. Снова:
Итак, вопрос таков: как вставить элементы перед существующими в настоящее время ячейками в collectionView с включенной подкачкой страниц, не мешая прокрутке и подкачке?