如何在项目添加到顶部时使UICollectionView不滚动

时间:2016-10-13 06:28:11

标签: 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 .ChildAdded,它会在加载时运行多次以使用所有帖子填充collectionView,然后在每次添加帖子时再次运行。如何停止自动滚动(通过1屏幕高度)?我尝试使用setContentOffset来进行countercroll,但问题是我添加的任何代码都会在每个帖子的加载时执行。所以它因使用太多内存而崩溃了应用程序,在加载时反复滚动上下30次。当帖子被添加到集合视图的顶部时,我只需要用户保持其滚动位置。

1 个答案:

答案 0 :(得分:0)

好的,这是我能做的最好的事情。在重新加载表格时,它仍然可以进行一些快速的屏幕闪光,类似于截图。

        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多个其他的东西来摆脱闪光灯,我能做到的唯一方法就是如果我以某种方式在不同的时间重新加载所有物品,以避开用户当前的滚动位置。如果我这样做,他们最终会看到一些奇怪的行为,如重复帖子和东西,但如果他们去仔细检查它会刷新...所以它不会真的那么高效。如果有人知道如何摆脱重装的快速“闪光”,请告诉我!

我试过的一些事情: 禁用动画,在不同的线程上运行不同的东西,逐个重新加载行,重新加载当前行的方式,其余的方式不同,其他一些东西,我不记得大声笑。如果有人可以摆脱我当前代码引起的闪光,那么我会选择他们的答案是正确的!