Skip to content

Instantly share code, notes, and snippets.

@trilliwon
Created July 1, 2019 12:34
Show Gist options
  • Save trilliwon/ef1b7e87ce91ad0c01cd1f8362c20aee to your computer and use it in GitHub Desktop.
Save trilliwon/ef1b7e87ce91ad0c01cd1f8362c20aee to your computer and use it in GitHub Desktop.
RaindropView
class RaindropView: UIView {
var images: [CGImage] {
return [UIImage(named: "rain"),
UIImage(named: "rain"),
UIImage(named: "rain"),
UIImage(named: "rain"),
UIImage(named: "rain")].map({ $0?.cgImage }).compactMap({ $0 })
}
var birthRate: Float = 2.0 {
didSet {
confettiViewEmitterLayer.birthRate = birthRate
}
}
private let confettiViewEmitterLayer = CAEmitterLayer()
private let confettiViewEmitterCell = CAEmitterCell()
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
backgroundColor = UIColor.clear
setupConfettiEmitterLayer()
confettiViewEmitterLayer.birthRate = 0.0
confettiViewEmitterLayer.emitterCells = generateConfettiEmitterCells()
layer.addSublayer(confettiViewEmitterLayer)
}
func setupConfettiEmitterLayer() {
confettiViewEmitterLayer.emitterSize = CGSize(width: bounds.width, height: 2)
confettiViewEmitterLayer.emitterShape = CAEmitterLayerEmitterShape.line
confettiViewEmitterLayer.emitterPosition = CGPoint(x: bounds.width / 2, y: 0)
}
func generateConfettiEmitterCells() -> [CAEmitterCell] {
let velocities: [CGFloat] = [500, 550, 600, 650, 700]
var cells = [CAEmitterCell]()
for image in images {
let cell = CAEmitterCell()
cell.contents = image
cell.birthRate = 5.0
cell.lifetime = 30.0
cell.lifetimeRange = 0
cell.scale = 0.3
cell.scaleRange = 0.35
cell.velocity = velocities[Int.random(in: 0..<velocities.count)]
cell.velocityRange = 0
cell.emissionLongitude = CGFloat.pi - 0.05
cells.append(cell)
}
return cells
}
}
extension String {
var cgImage: CGImage? {
let size = CGSize(width: 40, height: 40)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.clear.set()
let rect = CGRect(origin: .zero, size: size)
UIRectFill(CGRect(origin: .zero, size: size))
(self as AnyObject).draw(in: rect, withAttributes: [.font: UIFont.systemFont(ofSize: 40)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image?.cgImage
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment