2013-04-18 47 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中,这个代码可以同样或更好地工作。 ,