Как сделать так, чтобы UICollectionView не прокручивался, когда элемент добавляется в начало

#ios #swift #firebase #uicollectionview #firebase-realtime-database

#iOS #swift #firebase #uicollectionview #firebase-realtime-database

Вопрос:

Я, наконец, получил представление своей коллекции, чтобы не прокручиваться при обновлении. Я думаю, это было, когда я добавил это:

 self.collectionView.performBatchAnimated(false, updates: {() -> Void in
          self.collectionView.reloadData()
          }, completion: { _ in 
    })
  

Затем я понял, что самые новые сообщения идут снизу, и я хотел, чтобы они были вверху. Для этого я просто добавил их в массив в обратном порядке. Теперь единственная проблема заключается в том, что когда сообщение добавляется и переходит к началу, CollectionView перемещается вниз на одно сообщение, поскольку сообщение добавляется вверху. Это все:

 DataService.ds.REF_POSTS.child("(self.loggedInUser!.uid)").observeEventType(.ChildAdded, withBlock: { postDictionary in
            if postDictionary.exists() {
                self.posts.insert(postDictionary, atIndex: 0)
            }
            self.collectionView.performBatchAnimated(false, updates: {() -> Void in
                self.collectionView.reloadData()
                }, completion: { _ in
            })
})
  

Поскольку это Firebase .Дочерний элемент запускается несколько раз при загрузке, чтобы заполнить CollectionView всеми сообщениями, а затем запускается снова при каждом добавлении сообщения. Как я могу остановить эту автоматическую прокрутку (на 1 высоту экрана)? Я попытался использовать setContentOffset для встречной прокрутки, но проблема в том, что любой добавляемый мной код будет выполняться при загрузке для каждого отдельного сообщения. Таким образом, приложение разбилось из-за использования слишком большого объема памяти, из-за многократной прокрутки вверх и вниз, например, более 30 раз при загрузке. Мне просто нужно, чтобы пользователь сохранял свою позицию прокрутки, когда сообщение добавляется в верхнюю часть представления коллекции.

Комментарии:

1. Что бы обойти все это дерьмо, было бы, если бы я мог каким-то образом увеличить высоту содержимого collectionview вверху, тогда положение прокрутки не изменилось бы. Таким образом, мне не пришлось бы выполнять полную перезагрузку, а просто добавить элемент вверху, и ничего не пришлось бы менять!

Ответ №1:

Хорошо, это лучшее, что я мог сделать. При перезагрузке таблицы по-прежнему появляется небольшая быстрая вспышка экрана, похожая на снимок экрана.

         self.posts.insert(postDictionary, atIndex: 0)

        self.collectionView.performBatchAnimated(false, updates: {() -> Void in
            let currentOffset = self.collectionView.contentOffset.y
            let newOffset = currentOffset   self.screenHeight
            self.collectionView.setContentOffset(CGPointMake(0, newOffset), animated: false)
            self.collectionView.reloadDataImmediately()
            }, completion: { _ in
        })
  

Это вставляет элемент вверху, затем счетчик прокручивается, чтобы пользователь сохранял позицию. Я попробовал, вероятно, более 30 других способов избавиться от flash, и единственный способ, которым я мог это сделать, — это каким-то образом перезагрузить все элементы в разное время, чтобы обойти текущие позиции прокрутки пользователя. Если я это сделаю, они в конечном итоге увидят какое-то странное поведение, например, повторяющиеся сообщения и прочее, но если они перейдут к двойной проверке, это будет иметь refreshed…so на самом деле это было бы не так уж эффективно. Если кто-нибудь знает, как избавиться от быстрой «вспышки» при перезагрузке, пожалуйста, дайте мне знать!

Некоторые вещи, которые я пробовал: отключение анимации, запуск разных вещей в разных потоках, перезагрузка строк одна за другой, перезагрузка текущей строки одним способом, а остальные другим способом, куча других вещей, которые я не помню, лол. Если кто-нибудь сможет избавиться от этой вспышки, вызванной моим текущим кодом, я выберу их ответ как правильный!