所以我使用CAEmitterLayer开发了一个应用程序。最初我让它自动发出(当应用程序加载时,它会开始发出闪光),它在模拟器和设备中都运行良好。
现在,当用户点击屏幕时,我将其更改为发出。它在模拟器中工作正常。在设备上,它没有反应。请帮助我朝正确的方向发展。
在-viewDidLoad
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
在-viewWillAppear
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];
}
答案 0 :(得分:1)
所以我下载了你的项目。两个问题 - 一个是CFRelease不合适 - 你没有这种颜色。但更重要的是,如果从UIColor CGColor中获取颜色,则应该使用CG方法复制颜色,然后管理该资源。我知道这很复杂,但是当你混合使用CG和UI时,你会感到很复杂 - 你无法避免它。
我把你的项目转换为ARC,然后还创建了强大的ivars,它们包含你想要使用的UIColors(作为CGColorRefs)。你不能创建一个诱惑UIColor,要求它的CGColorRef,然后期望在UIColor消失时颜色就在附近。
稍微modified项目,它在模拟器和设备(iPhone 4)上运行良好。
[注意 - 非常好用的CAEmitter - 漂亮!!!]