2011-01-04 2 views
1

の場合にアニメーションが終了するかどうかをチェックする方法Circleと呼ばれるカスタムUIViewクラスをサブビューとして追加するコントローラがあります。具体的なインスタンスCircleを "circle"と呼ぶことにしましょう。アニメーションブロックが

CircleanimateExpandにはビューをアニメーション表示する方法があります。 、NSMutableArray circleArrayに追加拡張をアニメーション、および膨張の終わりに、私はからオブジェクトを削除したい、私はallocinit円にたい(コントローラに住んでいる)次のコードに

アレイ。私の試み:

Circle *circle = [[Circle alloc] init]; 
[circleArray addObject:circle]; 
[circle animateExpand]; 
[circleArray removeObjectIdenticalTo:circle]; 
[circle release]; 

アニメーションが終了する前に[circleArray removeObjectIdenticalTo:circle];が呼び出されます。アニメーションは別々のスレッドで行われるため、 CircleクラスはcircleArrayについて知らないので、私はcompletion:^(BOOL finished){ }に削除を実装できません。

どのような解決策が役に立ちます、ありがとう!

答えて

4

試してみてください。私は間違っていない場合は

Circle *circle = [[Circle alloc] init]; 
if (circle) { 
    [circleArray addObject: circle]; 

    [UIView 
     animateWithDuration: 1.0 // or whatever 
     animations:^{ 
      // the animations in -animateExpand "belong to" this outer animation block 
      [circle animateExpand]; 
     } 
     completion:^(BOOL finished) { 
      [circleArray removeObjectIdenticalTo: circle]; 
     }]; 

    [circle release]; 
} 
+0

注:素晴らしいブロックのものはiOS4.xだけです! –

+0

それはうまくいくと思う。私がgonaをしている場合を除いて、私はコントローラ全体にアニメーションコードを移動させるかもしれません... – bogardon

+0

'Circle'クラスの項目は' Circle'クラスのインターフェースの一部ではありませんので(あなたの質問で言ったように)後者が前者について知る方法はありません。 'Circle'を修正してブロック引数を受け入れ、それを内部の' animateWithDuration:animations:completion: '呼び出しに渡すこともできますが、これはあなたがしたいことに対する一般的な解決策です。 :) –

0

、ちょうど現在のビューのアニメーションを停止する方法はありません。しかし、新しいアニメーションがビューに適用されると、現在実行されているアニメーションが停止します。この場合、サークルを削除する前に、非常に短いアニメーションサイクル(たとえば0.1秒)を開始することができますが、これはあまり効果がありません。その後、削除を実行します。

関連する問題