CAEmitterLayer 动画在设备上不起作用

Posted

技术标签:

【中文标题】CAEmitterLayer 动画在设备上不起作用【英文标题】:CAEmitterLayer animation not working on device 【发布时间】: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 支持的项目。 【参考方案1】:

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

我将您的项目转换为 ARC,然后还创建了强大的 ivars,用于保存您想要使用的 UIColors(作为 CGColorRefs)。你不能创建一个诱人的 UIColor,向它询问它的 CGColorRef,然后期望当 UIColor 消失时该颜色仍然存在。

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

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

【讨论】:

非常感谢大卫 :-) 我发布 CGColorRef 的原因,如果我不发布它,有时我无法获得颜色变化和效果(我相信这是原因)而且我大多不会做启用 ARC 的项目。非常感谢您的努力和赞赏:-) 您应该切换到 ARC。您只需要记住保持对对象的强引用,然后通过将引用(ivar 或属性)设置为 nil 来释放。当你的课程被释放 ARC 然后为你释放你所有的 ivars/属性!我现在使用 ARC 一年了,再也回不去了! 我确实想试试 ARC。但是,我无法摆脱旧的方式 :-) 肯定会尝试一下。看来ARC更有优势!

以上是关于CAEmitterLayer 动画在设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Ionic 2 动画在 iOS 设备上不起作用

滚动上的fadeIn nav在移动设备上不起作用

通过关键帧动画背景位置在 Webkit 上不起作用

关键帧动画在 iPhone 上不起作用

为啥这个简单的动画在 iOS 7 上不起作用?

设置 UIBarButtonItem 动画在 iOS 11 上不起作用