swift 使用 CAEmitterLayer实现小雨、中雨、暴雨、下雪、沙尘暴、高温的动画
时间: 2023-07-03 18:25:14 浏览: 68
使用 `CAEmitterLayer` 可以很方便地实现各种粒子效果,下面是使用 `CAEmitterLayer` 实现不同天气效果的示例代码:
### 小雨效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let rain = makeRainCell()
emitterLayer.emitterCells = [rain]
view.layer.addSublayer(emitterLayer)
func makeRainCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "raindrop")?.cgImage
cell.birthRate = 50
cell.lifetime = 2
cell.velocity = 100
cell.velocityRange = 50
cell.yAcceleration = 500
cell.scale = 0.2
cell.scaleRange = 0.1
cell.emissionLongitude = -.pi
cell.emissionRange = .pi / 4
return cell
}
```
### 中雨效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let rain = makeRainCell()
emitterLayer.emitterCells = [rain]
view.layer.addSublayer(emitterLayer)
func makeRainCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "raindrop")?.cgImage
cell.birthRate = 100
cell.lifetime = 2
cell.velocity = 150
cell.velocityRange = 50
cell.yAcceleration = 500
cell.scale = 0.3
cell.scaleRange = 0.1
cell.emissionLongitude = -.pi
cell.emissionRange = .pi / 4
return cell
}
```
### 暴雨效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let rain = makeRainCell()
emitterLayer.emitterCells = [rain]
view.layer.addSublayer(emitterLayer)
func makeRainCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "raindrop")?.cgImage
cell.birthRate = 200
cell.lifetime = 2
cell.velocity = 200
cell.velocityRange = 50
cell.yAcceleration = 500
cell.scale = 0.4
cell.scaleRange = 0.1
cell.emissionLongitude = -.pi
cell.emissionRange = .pi / 4
return cell
}
```
### 下雪效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let snow = makeSnowCell()
emitterLayer.emitterCells = [snow]
view.layer.addSublayer(emitterLayer)
func makeSnowCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "snowflake")?.cgImage
cell.birthRate = 50
cell.lifetime = 10
cell.velocity = 50
cell.velocityRange = 20
cell.yAcceleration = 10
cell.scale = 0.2
cell.scaleRange = 0.1
cell.emissionLongitude = -.pi
cell.emissionRange = .pi / 4
return cell
}
```
### 沙尘暴效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let dust = makeDustCell()
emitterLayer.emitterCells = [dust]
view.layer.addSublayer(emitterLayer)
func makeDustCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "dust")?.cgImage
cell.birthRate = 100
cell.lifetime = 5
cell.velocity = 100
cell.velocityRange = 50
cell.yAcceleration = 10
cell.scale = 0.2
cell.scaleRange = 0.1
cell.emissionLongitude = -.pi
cell.emissionRange = .pi / 4
return cell
}
```
### 高温效果
```swift
let emitterLayer = CAEmitterLayer()
emitterLayer.emitterShape = .line
emitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 1)
let fire = makeFireCell()
emitterLayer.emitterCells = [fire]
view.layer.addSublayer(emitterLayer)
func makeFireCell() -> CAEmitterCell {
let cell = CAEmitterCell()
cell.contents = UIImage(named: "fire")?.cgImage
cell.birthRate = 100
cell.lifetime = 1
cell.velocity = 50
cell.velocityRange = 20
cell.yAcceleration = -50
cell.scale = 0.2
cell.scaleRange = 0.1
cell.color = UIColor.orange.cgColor
cell.emissionLongitude = .pi
cell.emissionRange = .pi / 4
return cell
}
```
以上代码中,每个天气效果都是通过创建一个 `CAEmitterLayer` 和一个或多个 `CAEmitterCell` 来实现的。在每个 `CAEmitterCell` 中,可以设置粒子的属性,例如:出生率、寿命、速度、加速度、缩放比例、颜色等等。可以根据具体需求自由调整每个属性的值,以达到想要的效果。