2010-12-10 7 views
0

CATransactionブロックの範囲を実行して、スーパーレイヤです次そこから所定の層を除去し、私はいくつかのコードを見ている

void RemoveImmediately(CALayer *layer) { 
    [CATransaction flush]; 
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 
    [layer removeFromSuperlayer]; 
    [CATransaction commit]; 
} 

Iアニメーションで与えられた層の位置を変化させる方法が書かれていますCAKeyframeAnimationを使用すると、次のようになります。

- (void)animateMovingObject:(NXUIObject*)obj 
      fromPosition:(CGPoint)startPosition 
      toPosition:(CGPoint)endPosition 
       duration:(NSTimeInterval)duration {  

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    pathAnimation.calculationMode = kCAAnimationPaced; 
    pathAnimation.duration = duration; 

    CGMutablePathRef curvedPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y); 
    CGPathAddCurveToPoint(curvedPath, NULL, 
         startPosition.x, endPosition.y, 
         startPosition.x, endPosition.y, 
         endPosition.x, endPosition.y); 
    pathAnimation.path = curvedPath; 
    [obj addAnimation:pathAnimation forKey:@"pathAnimation"]; 
    CGPathRelease(curvedPath); 
} 

今私は私のアプリで3つのサブレイヤーを持つ 'マスターレイヤー'を持っているとします。最初の2つのサブレイヤを別の位置に移動し、最後のサブレイヤを削除します。私も引数としてobj3を渡し、RemoveImmediately()を呼び出す場合、私は最初の2つの層は、アニメーションされて見ることができない

CALayer obj1 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj1]; 
[self animateMovingObject:obj1 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(100.0, 100.0) 
       duration:2.0]; 

CALayer obj2 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj2]; 
[self animateMovingObject:obj2 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(150.0, 100.0) 
       duration:2.0]; 

CALayer obj3 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj3]; 
// ... 
RemoveImmediately(obj3);  // This removes the two previous animations too 
//[obj3 removeFromSuperlayer]; // This just removes obj3, the previous animations works 

注:だから私は次のようでした。しかし、removeFromSuperlayerを呼び出すだけでobj3を削除すると、最初の2つのレイヤーが正常にアニメーション化されます。 CATransactionブロックは、CAKeyframeAnimationで作成されたアニメーションも含め、すべてのアニメーションをキャンセルするように見えます。

私は行方不明ですか?

ありがとうございます。

答えて

2

CATransactionの範囲は、ちょうど[CATransaction begin][CATransaction commit]の間でなければなりません。

また、そのコードに[CATransaction flush]は必要ありません。アップルは、パフォーマンス上の理由から保留中のトランザクションの実行を強制しないことをお勧めします。設定しているトランザクションは、保留中のアニメーションに影響を与えてはいけません。

私は、この奇妙な振る舞いがまだあなたのprevious questionで尋ねたものに関係していると推測しています。ここで、3つのアニメーションは何らかの形で互いに干渉しています。私がそこでコメントしたように、3つのアニメーションが3つの独立したアニメーションではなく、1つのレイヤーに追加されているように振る舞います。私はチェックし、起こっている可能性がないことを確認したい(交差ポインタなど)。

+0

ありがとう、私は物事を完了する方法を示した!問題は 'フラッシュ'メソッドでした。私はそれを削除し、今はすべてのアニメーションが正常に動作しているのを見ることができます。 'obj1'、 'obj2'、および 'obj3'に共通するのは、それらが 'masterLayer'のサブレイヤであるため、ポインタが交差していないか、別のアニメーションに干渉していないということだけです。 'flush'メソッドを呼び出すと、以前のアニメーションが停止しました(デリゲートメソッドの 'animationDidStop:finished:'終了引数がNOを返して、手動で停止したことを示しています( 'flush'メソッドが呼び出されたときに起こりました)。 –

+0

動作しましたが、私は、ドキュメントがフラッシュメソッドについて何を言っているのか理解しようとしました(http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush)、私の明示的なアニメーションがなぜ「停止」されるのかはまだ分かりません。 –

+0

@Eduardo - はい、私は '[CATransaction flush]'アニメーションを乱す問題もありました。これは、通常のCore Animationレンダリングパイプラインと干渉するためです。一度だけ私は何かのためにそれを必要としていました。それでも、私は最終的にその呼び出しを取り除くためにやっていたことを再設計する方法を見つけました。 –

関連する問題