Iphone CAEmitterLayer动画在设备上不工作

Iphone CAEmitterLayer动画在设备上不工作,iphone,objective-c,uitapgesturerecognizer,Iphone,Objective C,Uitapgesturerecognizer,所以我用CAEmitterLayer开发了一个应用程序。最初我让它自动发射(当应用程序加载时,它将开始发射火花),它在模拟器和设备中都运行良好 现在,我将其更改为当用户点击屏幕时发出。在模拟器中运行良好。在设备上,它不起反应。请帮我找到正确的方向 已初始化点击-viewDidLoad tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 在中分配-视图将出现

所以我用CAEmitterLayer开发了一个应用程序。最初我让它自动发射(当应用程序加载时,它将开始发射火花),它在模拟器和设备中都运行良好

现在,我将其更改为当用户点击屏幕时发出。在模拟器中运行良好。在设备上,它不起反应。请帮我找到正确的方向

已初始化点击
-viewDidLoad

tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
中分配-视图将出现

tap setNumberOfTapsRequired:1];
[self.view addGestureRecognizer:tap];

- (void) particles {

    if (!sparkling) {

        rootLayer = [CALayer layer];
        rootLayer.bounds = CGRectMake(0, 0, 320, 480);
        CGColorRef color = [[UIColor clearColor] CGColor];
        rootLayer.backgroundColor = color;
        CGColorRelease(color);

        const char* fileName = [[[NSBundle mainBundle] pathForResource:@"DazStarOutline" ofType:@"png"] UTF8String];
        CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename(fileName);
        id img = (__bridge id)CGImageCreateWithPNGDataProvider(dataProvider, NULL, NO, kCGRenderingIntentDefault);

        const char* fileNameR = [[[NSBundle mainBundle] pathForResource:@"DazRing" ofType:@"png"] UTF8String];
        CGDataProviderRef dataProviderR = CGDataProviderCreateWithFilename(fileNameR);
        id imgR = (__bridge id)CGImageCreateWithPNGDataProvider(dataProviderR, NULL, NO, kCGRenderingIntentDefault);

        mortor = [CAEmitterLayer layer];
        mortor.emitterPosition = CGPointMake(320, 0);
        mortor.renderMode = kCAEmitterLayerAdditive;

        CAEmitterCell *rocket = [CAEmitterCell emitterCell];
        rocket.emissionLongitude = M_PI / 2;
        rocket.emissionLatitude = 0;
        rocket.lifetime = 2.0;
        rocket.birthRate = 1;
        rocket.velocity = 400;
        rocket.velocityRange = 100;
        rocket.yAcceleration = -250;
        rocket.emissionRange = M_PI / 4;
        color = [[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.5] CGColor];
        rocket.color = color;
        CGColorRelease(color);
        rocket.redRange = 0.5;
        rocket.greenRange = 0.5;
        rocket.blueRange = 0.5;

        CAEmitterCell *spark = [CAEmitterCell emitterCell];
        spark.contents = img;
        spark.lifetime = 0.05;
        spark.yAcceleration = -250;
        spark.beginTime = 0.8;
        spark.scale = 0.4;
        spark.birthRate = 10;

        preSpark.emitterCells = [NSArray arrayWithObjects:spark, nil];
        rocket.emitterCells = [NSArray arrayWithObjects:flare, nil];
        mortor.emitterCells = [NSArray arrayWithObjects:rocket, nil];
        [rootLayer addSublayer:mortor];
        [self.view.layer addSublayer:rootLayer];

        sparkling = TRUE;
    }
}
轻拍手势法

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {

    [self particles];
}

所以我下载了你的项目。有两个问题-一个是CFRelease不合适-你没有这种颜色。但更重要的是,如果您从UIColor CGColor获取颜色,那么您应该真正使用CG方法来复制颜色,然后管理该资源。我知道这会变得复杂,但当你混合使用CG和UI时,你会变得复杂——你无法避免它

我将您的项目转换为ARC,然后还创建了强IVAR,用于保存您想要使用的UIColor(作为CGColorRef)。你不能创建一个诱人的UIColor,要求它提供它的CGColorRef,然后期望UIColor消失时该颜色会出现

在这个小项目中,它在模拟器和设备(iPhone4)上工作得非常好


[注意-CAEmitter的使用非常好-非常漂亮!!!]

如果您愿意花15分钟时间创建一个演示项目,其中只包含一个视图和此发射器(以及图像),并将其发布到您的公共DropBox文件夹中,我很乐意看一看。这可能很简单,只需使用演示应用程序就可以找到它。演示应用程序只是一个单视图应用程序,将点击识别器添加到主视图中,因此它非常简单。可以肯定。。。我将在这里发布链接:-)@David@DavidH请从这里得到它,我想尽快从u获得回复=)我下载了这个项目,并试图在模拟器中运行它-当我点击屏幕时它崩溃了(可能更早)。我在产品菜单下运行了“分析”——这是您应该做的事情——它给了我几个错误(比如,您使用了_桥,但没有使用ARC)。修复这些错误,让应用程序至少在模拟器和设备中运行,然后我可以重新测试。这应该是圆弧吗?如果是,为什么一个或多个文件不是圆弧?我要到今晚才能再看这个纽约时间,对不起,先生。在我这边效果很好。我只是在测试后才上传了代码。在分析时,它只给了我一个错误(CGColorRelease(color);)时的内存泄漏)。这不是一个支持ARC的项目。非常感谢David:-)我发布CGColorRef的原因,有时如果我不发布它,我无法获得颜色更改和效果(我认为这是原因),我大部分情况下不会在启用ARC的情况下执行项目。非常感谢您的努力和欣赏:-)您应该切换到ARC。您只需要记住保持对对象的强引用,然后通过将引用(ivar或属性)设置为nil来释放。当您的类发布时,ARC将为您发布所有IVAR/属性!我使用ARC已经一年了,再也不能回到原来的方式了!我确实想试试ARC。但是,我无法摆脱旧的方式:-)一定会尝试一下。似乎ARC有更多的优势!