2015-05-01 9 views
5

Mein Ziel ist es, eine Explosion ähnliche Animation zu machen, in der viele Partikel in kurzer Zeit emittiert werden. Mein Problem ist, dass CAEmitterLayer, wenn es zu senden beginnt, "zukünftige" Partikel hinzufügt, damit es so aussieht, als hätte die Animation schon eine Weile gedauert.Anfangspartikel von CAEmitterLayer beginnen nicht an der Emitterposition

Wie kann ich dies deaktivieren oder umgehen? Wenn ich den birthRate-Wert erhöhe, möchte ich nur, dass Partikel von der Emitterposition aus erscheinen und nicht an allen Punkten entlang der projektierten Lebensdauer der CAEmitterCell. Jede Hilfe wird geschätzt.

#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 

Antwort

22

Dieses Verhalten hat sich tatsächlich mit der Veröffentlichung von iOS 7 geändert und scheint seitdem nicht mehr zurück zu gehen. Es hat sich so verhalten, wie Sie es vor iOS 7 erwartet haben, aber entweder Apple hat einen Fehler eingeführt, der das verursacht hat, oder sie haben das Verhalten geändert, ohne jemandem etwas zu sagen.

Ich habe einen Fehler für dieses genaue Problem am 28. August 2013 eingereicht, die als Duplikat eines anderen Fehlerberichts für das gleiche Problem geschlossen wurde. Apples Bugreporter meldet, dass der andere Bug noch offen ist, was bedeutet, dass Apple es trotz mehr als anderthalb Jahren noch nicht angegangen hat.

Ich empfehle, einen eigenen Fehlerbericht bei Apple einzureichen, indem er ihnen eine einfache App gibt, die das Verhalten zeigt, und vielleicht wird sie dadurch wieder etwas aufgepasst, um etwas dagegen zu unternehmen.

EDIT:

Nach der Frage ein wenig Forschung, fand ich heraus, dass die Lösung diese Zeilen hinzuzufügen ist:

self.emitter.beginTime = CACurrentMediaTime(); 

Es ist wichtig zu wissen, dass CAEmitterLayer eine Unterklasse von CALayer, das entspricht zu dem CAMediaTiming Protokoll. Warum diese ganze Tatsache nicht besser dokumentiert ist, ist mir ein Rätsel.

Beachten Sie, dass Sie dies wahrscheinlich von Ihrer - (void)burst-Methode aus aufrufen möchten. Wenn Sie jedoch innerhalb kurzer Zeit erneut anrufen, während vorherige Partikel noch vorhanden sind, wird möglicherweise ein merkwürdiges Verhalten angezeigt, da beginTime zurückgesetzt wird .

+0

Danke für die schnelle Antwort! – WaltersGE1

+0

@ WaltersGE1 Ich habe ein paar mehr Informationen herausgefunden, die eigentlich helfen sollten. Anscheinend ist Apple sehr schlecht darin, einige sehr wichtige Dinge zu dokumentieren ... – Gavin

+0

Ich werde das ausprobieren. Vielen Dank! – WaltersGE1