【发布时间】:2012-08-30 13:31:51
【问题描述】:
所以我使用 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];
}
【问题讨论】:
-
如果您将花 15 分钟创建一个只有一个视图和此发射器(和图像)的演示项目,并将其发布到您的公共 DropBox 文件夹,我很乐意看看它。它可能很简单,只是做演示应用程序可能会让你找到它。演示应用程序只是一个单视图应用程序,将点击识别器添加到主视图,所以它真的很简单。
-
肯定会这样做...我会在这里发布链接:-) @David
-
@DavidH 请从这里得到它dl.dropbox.com/u/97646145/SampleEmission.zip我想尽快得到你的回复=)
-
我下载了项目并尝试在模拟器中运行它 - 当我点击屏幕时它崩溃了(可能更早)。我在产品菜单下运行了“分析”——这是你应该做的——它给了我几个错误(比如,你使用了 __bridge 但没有使用 ARC)。修复这些错误,让应用程序至少在模拟器和设备中运行,然后我可以重新测试。这应该是ARC吗?如果是这样,为什么一个或多个文件不是 ARC?直到今晚纽约,纽约时间,我才能再看这个。
-
对不起,先生。它在我的最后工作正常。我只是在测试后上传了代码。它在分析时只给了我一个错误(CGColorRelease(color); 处的内存泄漏)。它不是 ARC 支持的项目。
标签: iphone objective-c uitapgesturerecognizer