CollectionView с бесконечной горизонтальной прокруткой в ​​обоих направлениях и нумерацией страниц - PullRequest
0 голосов
/ 07 апреля 2020

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

перед прокруткой на предыдущая неделя: Week before scrolling back

после прокрутки: enter image description here

после ручной прокрутки коллекции. Снова: Week after scrolling back

Итак, вопрос таков: как вставить элементы перед существующими в настоящее время ячейками в collectionView с включенной подкачкой страниц, не мешая прокрутке и подкачке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...