iOS-直播中粒子效果

来源:互联网 发布:rpc动态端口 编辑:程序博客网 时间:2024/05/02 01:06

转载注明出处: http://blog.csdn.net/qxuewei/article/details/53942647

粒子效果的应用场景:
主播房间右下角粒子动画
雪花/下雨/烟花等效果
QQ生日快乐一堆表情的跳动

常规实现方法:

// 添加粒子效果    func addParticleEffect() {        // 1.创建发射器        let emitter = CAEmitterLayer()        // 2.发射器位置        emitter.emitterPosition = CGPoint(x: UIScreen.main.bounds.width * 0.5, y:  -20)        // 3.开启三维效果        emitter.preservesDepth = true        // 4.设置 Cell(对应其中一个粒子)        // 4.0.创建粒子        let cell = CAEmitterCell()        // 4.1.每秒发射粒子数        cell.birthRate = 20        // 4.2.粒子存活时间        cell.lifetime = 5        cell.lifetimeRange = 2.5        // 4.3.缩放比例        cell.scale = 0.7        cell.scaleRange = 0.3        // 4.4.粒子发射方向        cell.emissionLongitude = CGFloat(M_PI_2)        cell.emissionRange = CGFloat(M_PI_4)        // 4.5.粒子速度        cell.velocity = 150        cell.velocityRange = 50        // 4.6.旋转速度        cell.spin = CGFloat(M_PI_2)        // 4.7.粒子内容        cell.contents = UIImage(named: "good2_30x30")?.cgImage        // 5.将粒子添加到发射器中        emitter.emitterCells = [cell]        view.layer.addSublayer(emitter)    }

可以实现简单粒子效果:
这里写图片描述

通常在直播等软件中粒子效果不会只有单独一种粒子样式.所以需要定义多种粒子样式实现.利用面向协议的思想封装一个 Particleable 类. 继承此协议的控制器可具备粒子效果的功能.
核心代码:

import Foundationimport UIKitprotocol Particleable {    // 此处定义的方法,在继承此协议的类中必须实现否则会报错! - 保留OC特性//    func addParticleEffectTest(_ view : UIView)}extension Particleable where Self : UIViewController {    func addParticleEffect(_ point : CGPoint = CGPoint(x: UIScreen.main.bounds.width * 0.85, y: UIScreen.main.bounds.height - 20) )  {        // 1.创建发射器        let emitter = CAEmitterLayer()        // 2.发射器位置        emitter.emitterPosition = point        // 3.开启三维效果        emitter.preservesDepth = true        var cells = [CAEmitterCell]()        for i in 0..<10 {            // 4.设置 Cell(对应其中一个粒子)            // 4.0.创建粒子            let cell = CAEmitterCell()            // 4.1.每秒发射粒子数            cell.birthRate = Float(arc4random_uniform(4)) + 3            // 4.2.粒子存活时间            cell.lifetime = 5            cell.lifetimeRange = 2.5            // 4.3.缩放比例            cell.scale = 0.7            cell.scaleRange = 0.3            // 4.4.粒子发射方向            cell.emissionLongitude = CGFloat(-M_PI_2)            cell.emissionRange = CGFloat(M_PI_4 * 0.6)            // 4.5.粒子速度            cell.velocity = 100            cell.velocityRange = 50            // 4.6.旋转速度            cell.spin = CGFloat(M_PI_2)            // 4.7.粒子内容            cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage            cells.append(cell)        }        // 5.将粒子添加到发射器中        emitter.emitterCells = cells        view.layer.addSublayer(emitter)    }    func removeParticleEffect() {        //方式1: 常规遍历//        for layer in view.layer.sublayers! {//            if layer.isKind(of: CAEmitterLayer.self) {//                layer.removeFromSuperlayer()//            }//        }        //方式2: 映射        view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self)}).last?.removeFromSuperlayer()    }}

实现效果
这里写图片描述

完整项目链接:
https://github.com/qxuewei/XWCSDNDemos 中 XWParticleDemo-粒子效果

1 0