Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中结束碳层的正确方法是什么?_Swift_Particles_Caemitterlayer_Caemittercell - Fatal编程技术网

在Swift中结束碳层的正确方法是什么?

在Swift中结束碳层的正确方法是什么?,swift,particles,caemitterlayer,caemittercell,Swift,Particles,Caemitterlayer,Caemittercell,我在Swift中看到了很多连续发射器的例子,我在Obj-C中发现了一个例子,将发射器单元的出生率设置为0.0,但它似乎不起作用,所以我一定是做错了什么。在我的示例中,我可以看到这样的信息:出生率被设置为0 16次,但粒子继续无休止地流动 @IBAction func particleBtnAction(_ sender: Any) { let emitter = CAEmitterLayer() emitter.emitterPosition = CGPoint(x: self

我在Swift中看到了很多连续发射器的例子,我在Obj-C中发现了一个例子,将发射器单元的出生率设置为0.0,但它似乎不起作用,所以我一定是做错了什么。在我的示例中,我可以看到这样的信息:出生率被设置为0 16次,但粒子继续无休止地流动

@IBAction func particleBtnAction(_ sender: Any) {

    let emitter = CAEmitterLayer()
    emitter.emitterPosition = CGPoint(x: self.view.frame.size.width / 2, y: -10)
    emitter.emitterShape = kCAEmitterLayerLine
    emitter.emitterSize = CGSize(width: self.view.frame.size.width, height: 2.0)
    emitter.emitterCells = generateEmitterCells()
    self.view.layer.addSublayer(emitter)

    // perform selector after 1.5 seconds when particles start
    perform(#selector(endParticles), with: emitter, afterDelay: 1.5)

}

private func generateEmitterCells() -> [CAEmitterCell] {

    var cells:[CAEmitterCell] = [CAEmitterCell]()
    for index in 0..<16 {
        let cell = CAEmitterCell()
        cell.birthRate = 4.0
        cell.lifetime = 1.0
        cell.lifetimeRange = 0
        cell.velocity = 0.7
        cell.velocityRange = 0
        cell.emissionLongitude = CGFloat(Double.pi)
        cell.emissionRange = 0.5
        cell.spin = 3.5
        cell.spinRange = 0
        cell.scaleRange = 0.25
        cell.scale = 0.1
        cells.append(cell)
    }
    return cells
}

@objc func endParticles(emitterLayer:CAEmitterLayer) {

    for emitterCell in emitterLayer.emitterCells! {
        emitterCell.birthRate = 0.0
        print("birth rate set to 0")
    }

}
@IBAction func particleBtnAction(uu发件人:任意){
let emitter=CAEmitterLayer()
emitter.emitterPosition=CGPoint(x:self.view.frame.size.width/2,y:-10)
emitter.emitterShape=kCAEmitterLayerLine
emitter.emitterSize=CGSize(宽度:self.view.frame.size.width,高度:2.0)
emitter.emitterCells=generateEmitterCells()
self.view.layer.addSublayer(发射器)
//粒子启动1.5秒后执行选择器
执行(#选择器(endParticles),带有:发射器,后延迟:1.5)
}
专用函数generateEmitterCells()->[CAEmitterCell]{
变量单元格:[CAEmitterCell]=[CAEmitterCell]()

对于0..中的索引,您可以使用键路径为每个单元格指定一个名称,并在其中循环,以便在需要更改每个单元格时更改其属性:

private func generateEmitterCells() -> [CAEmitterCell] {

    var cells:[CAEmitterCell] = [CAEmitterCell]()
    for index in 0..<16 {
        let cell = CAEmitterCell()
        cell.birthRate = 4.0
        cell.lifetime = 1.0
        cell.lifetimeRange = 0
        cell.velocity = 0.7
        cell.velocityRange = 0
        cell.emissionLongitude = CGFloat(Double.pi)
        cell.emissionRange = 0.5
        cell.spin = 3.5
        cell.spinRange = 0
        cell.scaleRange = 0.25
        cell.scale = 0.1
        cell.name = "cell\(index)" // cell name
        cells.append(cell)
    }
    return cells
}

@objc func endParticles(emitterLayer:CAEmitterLayer) {

    for i in 0..<(emitterLayer.emitterCells?.count ?? 0){

        emitterLayer.setValue(0.0, forKeyPath: "emitterCells.cell\(i).birthRate")
        print("birth rate set to 0")

    }

}
private func generateEmitterCells()->[CAEmitterCell]{
变量单元格:[CAEmitterCell]=[CAEmitterCell]()

对于0..中的索引,将
CAEmitterLayer
寿命设置为零将停止发射任何新的
emitterCell

@objc func endParticles(emitterLayer:CAEmitterLayer) {
    emitterLayer.lifetime = 0.0
}

如果要结束粒子,可以尝试设置isHidden属性

emitter.isHidden = true
但要注意的是,所有的细胞都会瞬间消失,无论它们是在什么时候被释放出来的,还是它们的寿命

另一种可能是将所有与比例相关的属性设置为0,这样寿命和出生率就无关紧要了,因为新发射的细胞将不可见

cell.scaleSpeed = 0
cell.scaleRange = 0
cell.scale = 0

不确定我是否会使用私有API来实现这一点。请参见我的答案。检查此库如何Comets:那么以后如何重新启动发射?您可以将emitterLayer.lifetime设置为0以外的值。您还可能需要设置
emitterLayer.beginTime=CACurrentMediaTime()
再次启动时,否则精灵可能会出现在您无法预料的地方。