1

UICollectionViewFlowLayout インスタンスによってレイアウトが管理されるコレクション ビューがあります。コレクション ビューに長押しジェスチャ レコグナイザーが接続されています。そのジョブは、コレクション ビュー内のセルの 1 つの境界内で長押しが発生したかどうかを検出し、そうであれば、セルの変換をアニメーションで変更した後にそのセルを削除します。

これは、ジェスチャ認識エンジンによって実行されるアクションの関連部分です。

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

私はAppleDeveloperForumsでこの質問をしましたが、

-finalLayoutAttributesForDisappearingItemAtIndexPath:

UICollectionViewLayoutクラスの一部であるメソッド。

とにかく、UICollectionViewFlowLayoutをサブクラス化し、このメソッドをオーバーライドすることで、削除するセルの属性、特に変換を変更することができました。

このメソッドは、削除されるセルだけでなく、リレーアウト中にセルがその位置からシフトされる場合にも呼び出されることに注意してください。しかし、削除されているセルを追跡し、その属性のみを変更するコードを書くのは簡単です。

于 2012-10-19T15:46:30.833 に答える