Caemitterlayer анимация не работает на устройстве


Поэтому я разработал приложение с использованием 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];
}
2 2

2 ответа:

Итак, я скачал ваш проект. Две проблемы-одна заключается в том, что CFRelease не является правильным - Вы не владеете этим цветом. Но что еще более важно, если вы берете цвет из UIColor CGColor, вы должны действительно использовать метод CG для копирования цвета, а затем управлять этим ресурсом. Я знаю, что это становится сложным,но когда вы смешиваете CG и UI, вы получите сложность - вы не можете избежать ее.

Я взял ваш проект, преобразовал в ARC, а затем также создал сильные ивары, которые держат UIColors, которые вы хотите использовать (как CGColorRefs). Вы не можете создать искушение UIColor, попросить его CGColorRef, а затем ожидать, что этот цвет будет рядом, когда UIColor исчезнет.

Слегка модифицированный проект, он отлично работает на симуляторе и устройстве (iPhone 4).

[Примечание-действительно хорошее использование CAEmitter-довольно!!!]

Я тоже нахожу проектирование частиц в UIKit сложной задачей, поэтому я создал приложение для нее. Теперь я использую его для создания различных частиц в своих играх. Так просто! Это приложение iDevice, так что вы можете играть с частицами в автобусе или в торговом центре и сразу же экспортировать коды.

Если кто-нибудь заинтересован: http://iapps.emirbytes.com/particlex/index.html