swift - 在 Swift 中结束 CAEmitterLayer 的正确方法是什么?

标签 swift particles caemitterlayer caemittercell

我主要在 Swift 中看到连续发射器的示例,并且我在 Obj-C 中找到了一个将发射器单元的 birthRates 设置为 0.0 的示例,但它似乎不起作用,所以我必须是做错事。在我的示例中,我可以看到 16 次将出生率设置为 0 的消息,但粒子继续无休止地流动。

@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")
    }

}

最佳答案

CAEmitterLayerlifetime 设置为零会停止发射任何新的 emitterCells:

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

关于swift - 在 Swift 中结束 CAEmitterLayer 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271868/

相关文章:

ios - "' ViewController.Type ' does not have a member named . . . "

ios - 跨 ViewController 设置和访问全局属性的正确方法是什么?

Swift Core Data 添加额外的空行

java - libGDX ParticleEffect 运行时速度变化

MATLAB:在 for 循环中使用 ode45,使用动态变量进行粒子运动和交互

ios -- 如何限制 CAEmitter 粒子轨迹的范围?

ios - Spritekit- DidBeginContact 未被调用

python - 在 Pyswarm PSO 函数中实现约束

cocoa - ScreenSaverView 与 CAEmitterLayer 在第二个屏幕上不稳定

iOS - 使用 Swift 的 CAEmitterCell