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で作成されたアニメーションも含め、すべてのアニメーションをキャンセルするように見えます。
私は行方不明ですか?
ありがとうございます。
ありがとう、私は物事を完了する方法を示した!問題は 'フラッシュ'メソッドでした。私はそれを削除し、今はすべてのアニメーションが正常に動作しているのを見ることができます。 'obj1'、 'obj2'、および 'obj3'に共通するのは、それらが 'masterLayer'のサブレイヤであるため、ポインタが交差していないか、別のアニメーションに干渉していないということだけです。 'flush'メソッドを呼び出すと、以前のアニメーションが停止しました(デリゲートメソッドの 'animationDidStop:finished:'終了引数がNOを返して、手動で停止したことを示しています( 'flush'メソッドが呼び出されたときに起こりました)。 –
動作しましたが、私は、ドキュメントがフラッシュメソッドについて何を言っているのか理解しようとしました(http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush)、私の明示的なアニメーションがなぜ「停止」されるのかはまだ分かりません。 –
@Eduardo - はい、私は '[CATransaction flush]'アニメーションを乱す問題もありました。これは、通常のCore Animationレンダリングパイプラインと干渉するためです。一度だけ私は何かのためにそれを必要としていました。それでも、私は最終的にその呼び出しを取り除くためにやっていたことを再設計する方法を見つけました。 –