ios - 只运行一次 CAEmitterLayer

标签 ios swift uikit core-animation caemitterlayer

我只想运行一次 CAEmitterLayer,我想停止birthRate,但我做不到。我想要的是它在点击屏幕时只运行一次。我一直在尝试与代表合作,但我无法让它发挥作用。你能告诉我我的代码是否有效。

    import UIKit
    import PlaygroundSupport

    class Emitter {
        static func get(with image: UIImage) -> CAEmitterLayer {
            let emitter = CAEmitterLayer()
            emitter.emitterShape = kCAEmitterLayerLine
            emitter.emitterCells = generateEmitterCells(image: image)
            print("emit")
            emitter.setValue(0.0, forKey: "em")
            return emitter
        }

        static func generateEmitterCells(image: UIImage) -> [CAEmitterCell] {
            var cells = [CAEmitterCell]()
            let cell = CAEmitterCell()
            cell.contents = image.cgImage
            cell.birthRate = 0.1
            cell.lifetime = 20
            cell.velocity = 250
            cell.emissionRange = (10 * (.pi/180))
            cell.scale = 0.9
            cell.scaleRange = 0.3
            cell.velocityRange = 100
            cells.append(cell)
            print("cells")
            return cells
        }

    }

    class ViewController : UIViewController{
        override func viewDidLoad() {
            super.viewDidLoad()
            view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

            let view2 = UIView(frame: self.view.frame)

            self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 580)
            super.view.backgroundColor = UIColor.white
            self.view.addSubview(view2)
        }

        @objc func handleTap() {
            rain()
        }

        func rain() {
            let emitter = Emitter.get(with: UIImage(named: "Group 1493")!)
            emitter.emitterPosition = CGPoint(x: view.frame.width / 2, y: view.frame.height + 25)
            emitter.emitterSize = CGSize(width: view.frame.width, height: 2)
            self.view.layer.addSublayer(emitter)
        }

    }

    let controller = ViewController()
    PlaygroundPage.current.liveView = controller.view

最佳答案

您可以在第一次启动后将 生命周期 属性设置为 0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { emitter.lifetime = 0 }

关于ios - 只运行一次 CAEmitterLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49909876/

相关文章:

ios - 如何使用 drawRect 方法检测绘制项目上的触摸事件?

iOS 和 UIKit 类检查

ios - 如何在 iOS 7 下更改 UIPickerView 中文本的颜色?

ios - 无效的权利 Xcode

objective-c - UIProgressView : modify height for track line

iphone - iPhone 上的大事件指示器

iphone - iPad : how to change background color for Ipad app?

Swift - 自动将 pdf 文件保存到我 iPhone 上的文件应用程序

swift - UILongPressGestureRecognizer 和 UIScreenEdgePanGestureRecognizer

iphone - 更快的 iPhone 图形