iOS-ライブパーティクル効果


転載して出典を明記する: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)
    }

単純なパーティクルエフェクトを実現できる:iOS-直播中粒子效果_第1张图片
通常、生放送などのソフトウェアでは、パーティクル効果が単独のパーティクルスタイルのみであることはない.そのため、複数の粒子スタイルの実装を定義する必要がある.プロトコル向けのアイデアを利用してParticleable類をパッケージする.このプロトコルを継承するコントローラは、パーティクル効果の機能を備えることができる.コアコード:
import Foundation
import UIKit

protocol 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()
    }
}

実装効果iOS-直播中粒子效果_第2张图片
完全なプロジェクトリンク:https://github.com/qxuewei/XWCSDNDemos中XWParticleDemo-パーティクルエフェクト