UICollectionView重新排序动画

时间:2013-10-22 17:24:29

标签: objective-c ios6 uicollectionview

我正在制作一个包含所有基本内容的集合视图,例如默认的FlowLayout,独特的部分。
假设我正确使用collectionView:CellForItemAtIndexPath:和所有其他dataSource协议

我有mainData,这是一个字典数组(原始数据),mainDataReferenceOrderedmainDataNameOrderedmainDataQuantiteOrdered是包含与{{{1}相同数据的其他数组1}}(相同的元素指出)。
mainData是控制器当前指向有序数据的数组指针。

重新排序时,我只是更改集合视图批处理中的数据,如下所示:

dataToDisplay

但是,即使它们已经可见,或者在正确的位置,该集合也会淡化所有细胞。

我读了Apple documentation on UICollectionView,但我不知道我错过了什么。 我还阅读了other threads,但仍在寻找我必须做的事情。

批处理看起来知道要在单元格上应用哪个动画?


我的解决方案

这是我使用的最终代码,当然是我最接近的iOS编程指南。

[itemCollectionControl.collectionView performBatchUpdates:^{
        dataToDisplay = mainDataReferenceOrdered; //or any other ordered array
        [itemCollectionControl.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, itemCollectionControl.collectionView.numberOfSections)]];
    } completion:^(BOOL finished) {}];

我只是浏览所有旧的订购商品,检查他们的新位置,并将其应用于[itemCollectionControl.collectionView performBatchUpdates:^{ NSArray *oldOrder = dataToDisplay; dataToDisplay = mainDataNBContainersOrdered; for (NSInteger i = 0; i < oldOrder.count; i++) { NSIndexPath *fromIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; NSInteger j = [dataToDisplay indexOfObject:oldOrder[i]]; NSIndexPath *toIndexPath = [NSIndexPath indexPathForRow:j inSection:0]; [itemCollectionControl.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath]; } } completion:^(BOOL finished) { if (finished) { [itemCollectionControl.collectionView reloadData]; } }];
还有一些重复的细胞故障,但它在iOS7上看起来很好(不在iOS6上)。 在iOS7上完成可能没用,我在iOS6改组的最后强制使用正确的顺序。

修改

我想我找到了一个解决方案,但我无法再对该项目进行测试。也许只添加2行代码就可以解决这个可怕的故障。

在致电-[UICollectionView moveItemAtIndexPath:toIndexPath:]之前,请致电-[UICollectionView moveItemAtIndexPath:toIndexPath:],最后在所有行动-[UICollectionView beginUpdates]之后。

如果有人能够测试它发现它有效,请告诉我。

1 个答案:

答案 0 :(得分:6)

集合视图不知道数据模型中项目的标识,因此无法知道它们已移动。因此,您必须使用moveItemAtIndexPath:toIndexPath:明确告知集合视图每个单元格在批量更新中的位置。您可以通过循环遍历from数组中的项目并在to数组中查找它们的位置来自行计算。像这样的东西(从记忆中输入,对任何拼写错误都很抱歉):

[itemCollectionControl.collectionView performBatchUpdates:^{
    for (NSInteger i = 0; i < mainDataReferenceOrdered.count; i++) {
        NSIndexPath *fromIndexPath = [NSIndexPath indexPathForRow:i inSection:0];
        NSInteger j = [mainDataNameOrdered indexOfObject:mainDataReferenceOrdered[i]];
        NSIndexPath *toIndexPath = [NSIndexPath indexPathForRow:j inSection:0];
        [itemCollectionControl.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];
    }
} completion:^(BOOL finished) {}];

如果您有很多(数千个)项目,您可能需要考虑使用集合来加快查找速度。

更普遍适用的方法是使用TLIndexPathTools之类的东西,可以为您计算批量更新。看看Shuffle sample project