iphone - CAEmitterLayer 动画无法在设备上运行

标签 iphone objective-c uitapgesturerecognizer

所以我使用 CAEmitterLayer 开发了一个应用程序。最初我让它自动发射(当应用程序加载时,它将开始发射 Spark ),它在模拟器和设备中都工作得很好。

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

-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];
}

最佳答案

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

我将您的项目转换为 ARC,然后还创建了强大的 ivars 来保存您想要使用的 UIColors(如 CGColorRefs)。您无法创建一个临时 UIColor,向其询问其 CGColorRef,然后期望当 UIColor 消失时该颜色仍然存在。

稍微modified项目,它在模拟器和设备(iPhone 4)上运行良好。

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

关于iphone - CAEmitterLayer 动画无法在设备上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198069/

相关文章:

ios - 为 UIGestureRecognizer 设置委托(delegate)并发出警告

storyboard - 通过点击显示/隐藏 UIToolbar

swift - 使用 UITapGestureRecognizer、UIImageView 和 UITableViewCell 将参数传递给 Swift 中的选择器

android - OAuth Twitter 在 iPhone 和安卓上只有 Consumer Key(不使用 Consumer Secret)

iphone - Cocos2d CCMenuItem 选择时的动画

objective-c - 获取的结果 Controller 行为

ios - map View 不更新相机位置,也不使用 animateToLocation

iphone - 接近传感器在 iPhone 4 设备中不工作

ios - 查找当前加速度计值

ios - 检查收到的通知是否显示警报 View 的测试用例