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"];

我的贝塞尔路径是封闭的,并在四个位置点中形成一个“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

您是否尝试过查询CAEmitterLayer'presentationLayer属性并询问CALayer其位置的结果?表示层应该允许您访问层在动画期间出现在屏幕上的属性,而发射器层将为您提供所有当前动画结束时的属性。

这是由于Core Animation 的渲染架构中固有的模型视图分离。

于 2012-06-04T17:40:56.543 回答