1

CAEmitterCellを使用してアニメーション化されたCAEmitterLayerがあり、アニメーションは

 fireEmitter = (CAEmitterLayer*)self.layer; 
    fireEmitter.emitterPosition = CGPointMake(50, 50);
    fireEmitter.emitterSize = CGSizeMake(10, 10);

    CAEmitterCell* fire = [CAEmitterCell emitterCell];
    ...
    [fire setName:@"fire"];

CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"emitterPosition"];
    anim.path = theBezierPath.CGPath;
    anim.calculationMode = kCAAnimationCubicPaced;
    anim.repeatCount = HUGE_VALF;
    anim.duration = 12.0;
    [self.layer addAnimation:anim forKey:@"fire"];

私のベジェパスは閉じており、4つの位置ポイントから「8」を形成します。私のtimerFunctionを使用して、毎秒CAEmitterLayerの位置を取得しようとします。そのために私は使用します

-(CGPoint)getEmitterPosition
{
    return fireEmitter.emitterPosition;
}

エミッタークラスで

CGPoint emitterPosition = [self.ParticleEmitterView getEmitterPosition];
NSLog(@"%f / %f", emitterPosition.y, emitterPosition.y);

タイマー機能から。

しかし、アニメーションが実行されているとき、エミッターが画面上で実行されている間、コンソールはすべての呼び出しで同じ位置を吐き出します。

それはなぜですか。また、アニメーション化されたCAEmitterLayer / Cellのエミッター位置を取得するにはどうすればよいですか?

4

1 に答える 1

2

CAEmitterLayerpresentationLayerプロパティをクエリして、結果CALayerにその位置を尋ねてみましたか?プレゼンテーション層は、アニメーション中に画面に表示されるレイヤーのプロパティへのアクセスを提供する必要がありますが、エミッターレイヤーは、現在のすべてのアニメーションの終了時に表示されるプロパティを提供します。

これは、 CoreAnimationのレンダリングアーキテクチャに固有のモデルとビューの分離によるものです。

于 2012-06-04T17:40:56.543 に答える