2013-04-18 50 views
2

我只是簡單地將UIView添加到我的storyboard view controller,然後創建一個UIView類來顯示粒子效果。我將UIView's類名更改爲我創建的自定義類的名稱。我在UIView類中使用的代碼不顯示我期望的粒子效果。代碼如下:未顯示CAEmitterLayer

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 

     CGRect viewBounds = rect; 

    fireworksEmitter.emitterPosition = CGPointMake(viewBounds.size.width/2.0, viewBounds.size.height); 
    fireworksEmitter.emitterSize = CGSizeMake(viewBounds.size.width/2.0, 0.0); 
    fireworksEmitter.emitterMode = kCAEmitterLayerOutline; 
    fireworksEmitter.emitterShape = kCAEmitterLayerLine; 
    fireworksEmitter.renderMode  = kCAEmitterLayerAdditive; 
    fireworksEmitter.seed = (arc4random()%100)+1; 

    // Create the rocket 
    CAEmitterCell* rocket = [CAEmitterCell emitterCell]; 

    rocket.birthRate  = 1.0; 
    rocket.emissionRange = 0.25 * M_PI; // some variation in angle 
    rocket.velocity   = 380; 
    rocket.velocityRange = 100; 
    rocket.yAcceleration = 75; 
    rocket.lifetime   = 1.02; // we cannot set the birthrate < 1.0 for the burst 

    rocket.contents   = (id) [[UIImage imageNamed:@"DazRing"] CGImage]; 
    rocket.scale   = 0.2; 
    rocket.color   = [[UIColor redColor] CGColor]; 
    rocket.greenRange  = 1.0;  // different colors 
    rocket.redRange   = 1.0; 
    rocket.blueRange  = 1.0; 
    rocket.spinRange  = M_PI;  // slow spin 



    // the burst object cannot be seen, but will spawn the sparks 
    // we change the color here, since the sparks inherit its value 
    CAEmitterCell* burst = [CAEmitterCell emitterCell]; 

    burst.birthRate   = 1.0;  // at the end of travel 
    burst.velocity   = 0; 
    burst.scale    = 2.5; 
    burst.redSpeed   =-1.5;  // shifting 
    burst.blueSpeed   =+1.5;  // shifting 
    burst.greenSpeed  =+1.0;  // shifting 
    burst.lifetime   = 0.35; 

    // and finally, the sparks 

    CAEmitterCell* spark = [CAEmitterCell emitterCell]; 

    spark.birthRate   = 400; 
    spark.velocity   = 125; 
    spark.emissionRange  = 2* M_PI; // 360 deg 
    spark.yAcceleration  = 75;  // gravity 
    spark.lifetime   = 3; 

    spark.contents   = (id) [[UIImage imageNamed:@"DazStarOutline"] CGImage]; 
    spark.scaleSpeed  =-0.2; 
    spark.greenSpeed  =-0.1; 
    spark.redSpeed   = 0.4; 
    spark.blueSpeed   =-0.1; 
    spark.alphaSpeed  =-0.25; 
    spark.spin    = 2* M_PI; 
    spark.spinRange   = 2* M_PI; 

    // putting it together 
    fireworksEmitter.emitterCells = [NSArray arrayWithObject:rocket]; 
    rocket.emitterCells    = [NSArray arrayWithObject:burst]; 
    burst.emitterCells    = [NSArray arrayWithObject:spark]; 
    [self.layer addSublayer:fireworksEmitter]; 

    [self setNeedsDisplay]; 
} 
+1

請,永遠不會做任何東西,除了在'drawRect:'中繪製代碼。配置視圖和圖層不屬於那裏。 –

回答

1

1)刪除所有來自此的drawRect代碼,並把它放到UIView子類init方法,或由於您使用的故事板,把它變成awakeFromNib:

- (void)awakeFromNib { 
    [super awakeFromNib]; 

    CGRect viewBounds = rect; 

    fireworksEmitter = (CAEmitterLayer*)self.layer; 
    fireworksEmitter.emitterPosition = CGPointMake(viewBounds.size.width/2.0, viewBounds.size.height); 
    fireworksEmitter.emitterSize = CGSizeMake(viewBounds.size.width/2.0, 0.0); 
    fireworksEmitter.emitterMode = kCAEmitterLayerOutline; 
    fireworksEmitter.emitterShape = kCAEmitterLayerLine; 
    fireworksEmitter.renderMode  = kCAEmitterLayerAdditive; 
    fireworksEmitter.seed = (arc4random()%100)+1; 

    // Create the rocket 
    CAEmitterCell* rocket = [CAEmitterCell emitterCell]; 

    rocket.birthRate  = 1.0; 
    rocket.emissionRange = 0.25 * M_PI; // some variation in angle 
    rocket.velocity   = 380; 
    rocket.velocityRange = 100; 
    rocket.yAcceleration = 75; 
    rocket.lifetime   = 1.02; // we cannot set the birthrate < 1.0 for the burst 

    rocket.contents   = (id) [[UIImage imageNamed:@"DazRing"] CGImage]; 
    rocket.scale   = 0.2; 
    rocket.color   = [[UIColor redColor] CGColor]; 
    rocket.greenRange  = 1.0;  // different colors 
    rocket.redRange   = 1.0; 
    rocket.blueRange  = 1.0; 
    rocket.spinRange  = M_PI;  // slow spin 

    CAEmitterCell* burst = [CAEmitterCell emitterCell]; 
    burst.birthRate   = 1.0;  // at the end of travel 
    burst.velocity   = 0; 
    burst.scale    = 2.5; 
    burst.redSpeed   =-1.5;  // shifting 
    burst.blueSpeed   =+1.5;  // shifting 
    burst.greenSpeed  =+1.0;  // shifting 
    burst.lifetime   = 0.35; 

    CAEmitterCell* spark = [CAEmitterCell emitterCell]; 
    spark.birthRate   = 400; 
    spark.velocity   = 125; 
    spark.emissionRange  = 2* M_PI; // 360 deg 
    spark.yAcceleration  = 75;  // gravity 
    spark.lifetime   = 3; 

    spark.contents   = (id) [[UIImage imageNamed:@"DazStarOutline"] CGImage]; 
    spark.scaleSpeed  =-0.2; 
    spark.greenSpeed  =-0.1; 
    spark.redSpeed   = 0.4; 
    spark.blueSpeed   =-0.1; 
    spark.alphaSpeed  =-0.25; 
    spark.spin    = 2* M_PI; 
    spark.spinRange   = 2* M_PI; 

    fireworksEmitter.emitterCells = [NSArray arrayWithObject:rocket]; 
    rocket.emitterCells    = [NSArray arrayWithObject:burst]; 
    burst.emitterCells    = [NSArray arrayWithObject:spark]; 
} 
+0

我猜'CGRect viewBounds = rect;'現在會出現編譯錯誤:) – KIDdAe

1

您的代碼看起來很好,所以這裏有一些建議

  • 你不顯示在其中創建fireworksEmitter。如果你不在allocinit某處,你會得到一個沒有錯誤或警告的空白屏幕。

  • ,如果你沒有一個名爲「DazRing」和「DazStarOutline」(alpha通道)資產(拼寫檢查),你會得到一個空白屏幕,沒有錯誤或警告

儘管此代碼將從drawRect內部運行,這不適合它。你沒有做任何繪畫(直接) - 而是你正在設置和添加一個圖層。你當然不應該從drawRect內部撥打setNeedsDisplay。如果你把它(例如)放在awakeFromNib中,這個代碼可以同樣或更好地工作。 ,