UICollectionView moveItemAtIndexPath:toIndexPath:发出不在屏幕上的移动项目

我试图在iOS 6的UICollectionView中重新设置项目的animation。

我写了这个代码:

NSMutableDictionary *from = [NSMutableDictionary dictionaryWithCapacity:self.count]; for (int ii = 0; ii < self.count; ii++) { MyItem item = [self getItemAtIndex:(NSInteger)ii]; [from setObject:[NSNumber numberWithInt:ii] forKey:[NSNumber numberWithInt:item.id]]; } [self sort]; [self.collectionView performBatchUpdates:^{ for (int ii = 0; ii < self.count; ii++) { MyItem item = [self getItemAtIndex:(NSInteger)ii]; NSNumber *prevPos = (NSNumber *)[from objectForKey:[NSNumber numberWithInt:item.id]]; if ([prevPos intValue] != ii) { NSIndexPath *from = [NSIndexPath indexPathForItem:prevPos.intValue inSection:0]; NSIndexPath *to = [NSIndexPath indexPathForItem:ii inSection:0]; [self.collectionView moveItemAtIndexPath:from toIndexPath:to]; } } } completion:nil]; 

首先,我将所有物品的当前位置保存在一本字典中,然后我将这些物品分类到新的位置,然后我将所有的物品都移​​走,并将它们从原来的位置移动到新的位置。

当所有的项目都显示在屏幕上的时候,这个效果很好,但是如果列表的长度超过了10,这使得一些项目当前不可见(因为它们在列表的可见部分的上面或下面),这会导致这些项目突然stream行在可见的指标中存在,并在其他地方animation,当animation停止时,它们被隐藏起来。 这看起来很奇怪,因为有些东西出现在别人之上

这是iOS 6 UICollectionView的问题,我在这里做错了什么?

它看起来像UICollectionView重复使用单元格,使您的animation看起来不好。 任何离开屏幕的单元格都可以重新使用。

那么为什么你的animation看起来很时髦?

单元格的起始和结束位置,以及是否隐藏,在移动单元格时都会自动处理。 为了使这些animation看起来不错,还需要更新数据源,因为代码使用它来确定单元格在animation期间应该开始还是结束的位置。

在调用索引更新块之前,请确保使用新索引位置更新数据源。 这样,苹果公司的代码就可以获得所需要的信息,可以让你的单元格更加美观,美观。

从UICollectionViews上的Apple文档 :

要插入,删除或移动单个部分或项目,您必须执行以下步骤:

  1. 更新数据源对象中的数据。
  2. 调用收集视图的相应方法来插入或删除节或项目。

在通知任何更改的集合视图之前,更新数据源至关重要。 集合视图方法假定您的数据源包含当前正确的数据。 如果没有,收集视图可能会从您的数据源收到错误的项目集合,或者询问那些不存在的项目,并使您的应用程序崩溃。