#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 на самом деле это было бы не так уж эффективно. Если кто-нибудь знает, как избавиться от быстрой «вспышки» при перезагрузке, пожалуйста, дайте мне знать!
Некоторые вещи, которые я пробовал: отключение анимации, запуск разных вещей в разных потоках, перезагрузка строк одна за другой, перезагрузка текущей строки одним способом, а остальные другим способом, куча других вещей, которые я не помню, лол. Если кто-нибудь сможет избавиться от этой вспышки, вызванной моим текущим кодом, я выберу их ответ как правильный!