粒子动画效果实现是通过CALayer的子类,CAEmitterLayer实现。
实现粒子动画效果分以下几个步骤:
// 1.创建发射器
let layer = CAEmitterLayer()
// 2.发射器位置()
layer.position = point
//3.开启3D效果
layer.preservesDepth = true
// 4.创建粒子, 并且设置粒子相关的属性
var cells = [CAEmitterCell]()
for i in 0..<10{//10是图片的数量,你要显示几种粒子就是几
// 4.1 创建例子Cell
let cell = CAEmitterCell()
//4.2 粒子的速率
cell.velocity = 150
cell.velocityRange = 100
// 4.3 设置例子的大小
cell.scale = 0.7
cell.scaleRange = 0.3
//4.4 粒子的方向
//emissionLongitude设置垂直方向,emissionLatitude设置水平方向 粒子默认是水平向右即0度角方向
cell.emissionLongitude = CGFloat(-Double.pi / 2)//垂直往上方向
cell.emissionRange = CGFloat(Double.pi / 2 / 6)//30度角度
//4.5 设置粒子的存活时间
cell.lifetime = 3.0
cell.lifetimeRange = 1.5
//4.6 设置粒子的旋转
cell.spin = CGFloat(-Double.pi / 2)
cell.spinRange = CGFloat(Double.pi / 2 / 2)
//4.7 设置粒子每秒弹出的个数
cell.birthRate = 3
//4.8 粒子的图片
cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage
cells.append(cell)
}
// 5.将粒子设置到发射器中
layer.emitterCells = cells
// 6.将发射器的layer添加到父layer中
view.layer.addSublayer(layer)
根据需要可以多设置几个发射器实现相应的效果
//面向协议开发
swift中,protocol 可以被类,枚举,结构体等任何东西遵守。将某一功能实现写在一个protocol的extension里面,遵守这个协议就具备这个功能。像一个零部件,拿过来就能用。
上面,粒子动画效果实现,用面向协议开发的思想实现如下
protocol Emitterable{
}
extension Emitterable where Self : UIViewController{//where 过滤遵守协议的对象,此处只有UIviewController能遵守协议
func startEmitting(_ point : CGPoint){
//将上面粒子动画实现代码copy至此即可
}
func stopEmitting(){
view.layer.sublayers?.filter({$0.isKind(of: CAEmitterLayer.self)}).first?.removeFromSuperlayer()}
}
第一次写,记录自己学的东西,不到之处,请多指教,谢谢。