CollectionView滚动到新插入的项目

时间:2019-03-11 15:02:27

标签: swift animation uicollectionview nsfetchedresultscontroller

我有一个由NSFetchedResultsController驱动的CollectionView。

CollectionViewLayout是按名称的升序排列的水平“轮播”布局,用于存储单元格。

新商品中插入了海关动画。

 func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {

if type == NSFetchedResultsChangeType.Insert {
    println("Insert Object: \(newIndexPath)")

   UIView.animate(withDuration: 1.0, delay: 0.0, options: .curveEaseOut, animations: {
       self.collectionView?.insertItems(at: [newIndexPath])
   }, completion: { finished in
       self.collectionView?.scrollToItem(at: newIndexPath, at: .centeredHorizontally, animated: true)
})
    )
...

它可以工作,但是动画有点小故障,并且滚动同时发生。

我想滚动到Item,然后使用自定义动画将其插入,但是如果我滚动到Item之前将其插入,则应用程序崩溃。

这里正确的做法是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

通过查看该函数,我可以想象到,您看到的故障是CollectionView向前滚动,然后向后滚动橡皮筋/“传送”。

我认为这可能是由于您试图同时运行两个动画而发生的。 您的第一个动画UIView.animate()使滚动到新插入项的动画显示出来。但是,当您调用collectionView?.scrollToItem()时,您也会对其进行动画处理(见下文)

self.collectionView?.scrollToItem(..., animated: true) <--

这可能就是为什么它不起作用的原因;您正在尝试制作动画动画。 尝试将animation设置为false,看看是否可以解决该问题。