UICollectionViewanimation数据更改

在我的项目中,我使用UICollectionView来显示图标的网格。

用户可以通过点击一个分段的控件来改变sorting,这个控件从不同的NSSortDescriptor的核心数据中调用一个提取。

数据量总是相同的,只是以不同的部分/行结束:

- (IBAction)sortSegmentedControlChanged:(id)sender { _fetchedResultsController = nil; _fetchedResultsController = [self newFetchResultsControllerForSort]; NSError *error; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); } [self.collectionView reloadData]; } 

问题是reloadData不会animation变化,UICollectionView只是popup新的数据。

我应该跟踪更改之前和之后的单元格的indexPath,并使用[self.collectionView moveItemAtIndexPath:toIndexPath:]来执行更改的animation,或者有更好的方法吗?

我没有得到很多subclassing的collectionViews,所以任何帮助将是伟大的…

谢谢,比尔。

reloadData不会animation,也不会放在UIViewanimation块中。 它想要在UICollecitonView performBatchUpdates块中,所以尝试更类似于:

 [self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:^(BOOL finished) {}]; 

-performBatchUpdates:包装-reloadData -performBatchUpdates:似乎不会导致单节集合视图进行animation处理。

 [self.collectionView performBatchUpdates:^{ [self.collectionView reloadData]; } completion:nil]; 

但是,这个代码的作品:

 [self.collectionView performBatchUpdates:^{ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; } completion:nil]; 

这是我做了什么animation重新加载所有部分:

 [self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]]; 

Swift 3

 let range = Range(uncheckedBounds: (0, collectionView.numberOfSections)) let indexSet = IndexSet(integersIn: range) collectionView.reloadSections(indexSet) 

重新加载performBatchUpdates:completion: block中的整个集合视图在iOS 9模拟器上为我做了一个小问题的animation。 如果你有一个特定的UICollectionViewCell你想要删除,或者如果你有它的索引path,你可以调用deleteItemsAtIndexPaths:在该块。 通过使用deleteItemsAtIndexPaths:它做了一个平滑和漂亮的animation。

 UICollectionViewCell* cellToDelete = /* ... */; NSIndexPath* indexPathToDelete = /* ... */; [self.collectionView performBatchUpdates:^{ [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]]; // or... [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; } completion:nil]; 

帮助文字说:

调用此方法重新加载集合视图中的所有项目。 这将导致集合视图丢弃任何当前可见的项目并重新显示它们。 为了提高效率,收集视图仅显示可见的单元格和补充视图。 如果收集数据由于重新加载而收缩,则收集视图会相应地调整其滚动偏移量。 您不应该在插入或删除项目的animation块中间调用此方法。 插入和删除操作会自动使表的数据得到适当的更新。

我认为关键部分是“导致收集视图丢弃任何目前可见的项目”。 如何animation它丢弃的物品的移动?

如果你想更多的控制和可定制的function检查这个 ,它包含了对UICollectionViewCellanimation的各种方式非常详细的解释。

对于迅速的用户来说这很方便 –

 collectionView.performBatchUpdates({ self.collectionView.reloadSections(NSIndexSet(index: index)) }, completion: nil)