1

我有一个集合视图,其布局由 UICollectionViewFlowLayout 实例管理。我有一个长按手势识别器附加到集合视图,其工作是检测是否在集合视图中的一个单元格的范围内发生长按,如果是,则在动画更改单元格的变换后删除该单元格。

这是手势识别器执行的操作的相关部分:

UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
[UIView animateWithDuration:2.0 animations:^{
    cell.layer.transform = CATransform3DMakeScale(1.0, 0.0, 1.0); // an example animation - squish the cell vertically

} completion:^(BOOL fin) {
     //[cell.layer removeAllAnimations];
     [self.model.numb3rs removeObjectAtIndex:[indexPath row]]; // update model
     [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; // delete item
 }];

问题是删除方法似乎在单元格上执行自己的属性更改/动画,这与我的动画效果不佳。例如,在我试图在这里实现的效果中,一旦单元格完全垂直压扁,我希望它不会再次显示在视图中,但是 deleteItemsAtIndexPaths: 调用会导致单元格的“幽灵”出现然后随着方法执行自己的变换和不透明动画而淡出。

我完全错误地接近它吗?可能集合视图架构提供了一种更好的方法来做我想做的事,而不是像我尝试的那样明确地为单元格设置动画然后删除它?

我希望我能在这里得到一个快速的答案,而不是深入研究文档。

4

1 回答 1

1

我在 Apple Developer Forums 上问了这个问题,并获悉了

-finalLayoutAttributesForDisappearingItemAtIndexPath:

UICollectionViewLayout 类的一部分的方法。

无论如何,通过继承 UICollectionViewFlowLayout 并覆盖此方法,我能够修改要删除的单元格的属性 - 特别是转换。

需要注意的一点是,此方法不仅会为要删除的单元格调用,而且还会为在重新布局期间从其位置移动的单元格调用。但是编写代码来跟踪被删除的单元格并只修改其属性是很简单的。

于 2012-10-19T15:46:30.833 回答