14

私の目標は、短時間で多くのパーティクルが放出される爆発のようなアニメーションを作成することです。私の問題は、CAEmitterLayer が放出を開始すると、「未来の」パーティクルを追加して、アニメーションがしばらく実行されているように見えることです。

これを無効または回避するにはどうすればよいですか? birthRate を増やすと、CAEmitterCell の投影された寿命に沿ったすべてのポイントではなく、emitterPosition からパーティクルが出現し始めるだけです。どんな助けでも大歓迎です。

#import "EmitterView.h"

@interface EmitterView ()

@property CAEmitterLayer* emitter;

@end

@implementation EmitterView

- (void) awakeFromNib {
    [super awakeFromNib];
    self.emitter = (CAEmitterLayer*)self.layer;

    CAEmitterCell* snowflake = [CAEmitterCell emitterCell];
    snowflake.contents = (id)[[UIImage imageNamed: @"snowflake"] CGImage];
    snowflake.lifetime = 3;
    snowflake.birthRate = 1;
    snowflake.velocity = 50;
    snowflake.emissionRange = 3.1415;

    self.emitter.birthRate = 0;
    self.emitter.emitterCells = [NSArray arrayWithObject: snowflake];
    self.emitter.emitterPosition = CGPointMake(100, 100);
    self.emitter.emitterSize = CGSizeMake(0, 0);
    self.emitter.emitterShape = kCAEmitterLayerPoint;
}

+ (Class) layerClass {
    return [CAEmitterLayer class];
}

- (void) burst {
    self.emitter.birthRate = 10;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.emitter.birthRate = 0;
    });
}

@end
4

1 に答える 1

34

この動作は、実際には iOS 7 のリリースで変更され、それ以降元に戻っていないようです。iOS 7 の前に期待どおりに動作していましたが、Apple がこれを引き起こすバグを導入したか、誰にも言わずに動作を変更することを選択しました。

私は 2013 年 8 月 28 日にこの正確な問題についてバグを報告しましたが、これは同じ問題に関する別のバグ レポートの重複としてクローズされました。Apple のバグ報告者は、もう 1 つのバグがまだ未解決であると報告しています。つまり、Apple は 1 年半以上にわたって対処しているにもかかわらず、まだ対処していないということです。

Apple に独自のバグ レポートを提出し、その動作を示す簡単なアプリを提供することをお勧めします。

編集:

この問題を少し調べたところ、解決策は次の行を追加することであることがわかりました。

self.emitter.beginTime = CACurrentMediaTime();

CAEmitterLayerが のサブクラスであり、プロトコルCALayerに準拠していることを知っておくことが重要です。CAMediaTimingこの事実全体がより適切に文書化されていない理由は、私にはわかりません。

メソッドからこれを呼び出したいと思う- (void)burstかもしれませんが、以前のパーティクルがまだ存在している間に短い時間内にもう一度呼び出すと、beginTime.

于 2015-05-01T20:19:16.327 に答える