ios – CAEmitterCell不尊重birthRate的变化

我想创建一个只在用户触摸屏幕时发出的粒子效果,但是一旦设置为非零值,我就无法更改CAEmitterCell birthRate属性.

我有一个UIView的子类,它按照我想要的方式设置我的CAEmitterLayer和我的CAEmitterCell.我在该类上定义了两个属性:

@property (strong,nonatomic) CAEmitterLayer *emitterLayer;
@property (strong,nonatomic) CAEmitterCell *emitterCell;

然后,在我的视图控制器中,我正在跟踪触摸,设置emitterLayer的位置和emitterCell birthrate:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint tappedPt = [touch locationInView:touch.view];
    NSLog(@"began x:%f y:%f",tappedPt.x,tappedPt.y);
    emitterView.emitterCell.birthRate = 42;
    emitterView.emitterLayer.emitterPosition = tappedPt;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint tappedPt = [touch locationInView:touch.view];
    NSLog(@"moved x:%f y:%f",tappedPt.y);
    emitterView.emitterLayer.emitterPosition = tappedPt;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"ending %f",emitterView.emitterCell.birthRate);
    emitterView.emitterCell.birthRate = 0.00;
    NSLog(@"ended %f",emitterView.emitterCell.birthRate);
}

日志报告emitterView.emitterCell.birthRate发生了变化:

began x:402.000000 y:398.500000
ending 42.000000
ended 0.000000

当我触摸屏幕时,发射器按预期启动,图层跟随触摸,但当我结束触摸时,发射器单元愉快地发出最初设置的任何值(touchesBegan中设置的值).无论我做什么,一旦设置为非零值,我似乎无法改变出生率值.日志报告值已正确设置,但发射器不断发光.

但是,如果我更改touchesEnded方法来更改图层的位置,在我在emitterCell上设置birthRate后,一切都按预期工作:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint tappedPt = [touch locationInView:touch.view];
    NSLog(@"began x:%f y:%f",tappedPt.y);

    NSLog(@"ending %f",emitterView.emitterCell.birthRate);
    emitterView.emitterCell.birthRate = 0.0;
    NSLog(@"ended %f",emitterView.emitterCell.birthRate);
    emitterView.emitterLayer.emitterPosition = tappedPt;
}

有人可以解释一下原因吗?

解决方法

我不知道为什么它表现得有点奇怪但我发现使用键值编码解决了问题并且单元格停止发出:

假设您的CAEmitterLayer是“yourEmitterLayer”,并且您有一个名为“yourEmitterCell”的CAEmitterCell,如果置于touchesEnded内,这将停止发射:

[yourEmitterLayer setValue:[NSNumber numberWithInt:0] forKeyPath:@"emitterCells.yourEmitterCell.birthRate"];

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...