我有一个集合视图,其布局由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:call会导致单元格&#39 ; s"鬼"在方法执行自己的变换和不透明度动画时显示然后淡出。
我接近它完全错了吗?可能集合视图架构提供了一种更好的方式来做我想要的,而不是明确动画单元格,然后像我尝试一样删除它?
我希望我能够在这里得到一个快速的答案,而不是必须深入挖掘文档。
答案 0 :(得分:1)
我在Apple开发者论坛上提出了这个问题,并被告知了
-finalLayoutAttributesForDisappearingItemAtIndexPath:
方法,它是UICollectionViewLayout类的一部分。
无论如何,通过继承UICollectionViewFlowLayout并重写此方法,我能够修改我正在删除的单元格的属性 - 特别是变换。
需要注意的一点是,此方法不仅会被删除的单元格调用,而且还会在重新布局期间调用从其位置移位的单元格。但是编写代码来跟踪被删除的单元格并且仅修改其属性非常简单。