UICollectionView moveItemAtIndexPath:toIndexPath:问

2019-07-04 11:30发布

我试图动画重新排序在iOS 6中UICollectionView项目。

我写了这个代码:

    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,这使得一些项目,目前看不到(因为它们的上方或下方的列表的可见部分),它会导致这些项目突然蹦出成可见的指标存在并获得动画到其他地方,和动画停止时,他们是隐藏的。 这看起来真的很怪异,因为有出现在他人之上的项目...

这是与iOS 6 UICollectionView一个问题,我在错在这里做什么?

Answer 1:

它看起来像UICollectionView被重用细胞以这样的方式来让你的动画看起来很糟糕。 该屏幕外的任何细胞变得可重用。

那么,为什么你的动画看时髦?

开始和结束单元格的位置,如果它被隐藏或不,是自动将所有的照顾,当你移动的细胞。 对于那些动画好看,你也需要更新您的数据源,因为它出现的代码使用,以确定细胞应启动和动画过程中结束。

在你打电话给你的索引更新模块,确保您的数据源与新的索引位置更新。 这样,苹果公司的代码有需要移动你的细胞在更多的信息,可以说,美观的方式。

从上UICollectionViews苹果文档 :

要插入,删除或移动单节或项目,你必须遵循以下步骤:

  1. 更新数据源对象中的数据。
  2. 调用集合视图的适当的方法插入或删除的部分或项目。

你通知的任何更改集合视图之前更新您的数据源,这一点至关重要。 该集合视图方法假定您的数据源包含当前正确的数据。 如果没有,集合视图可能与您的数据源接收错误的设定项目或要求不在那里,崩溃您的应用程序项目。



文章来源: UICollectionView moveItemAtIndexPath:toIndexPath: issues moving items not on screen