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)