71 lines
2.0 KiB
Swift
71 lines
2.0 KiB
Swift
//
|
|
// PulseAnimation.swift
|
|
// ButtonLayersClickStyle
|
|
//
|
|
// Created by Рустам Мотыгуллин on 09.03.2022.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class PulseAnimation: CALayer {
|
|
|
|
var animationGroup = CAAnimationGroup()
|
|
var animationDuration: TimeInterval = 1.5
|
|
var radius: CGFloat = 200
|
|
var numebrOfPulse: Float = Float.infinity
|
|
|
|
override init(layer: Any) {
|
|
super.init(layer: layer)
|
|
}
|
|
|
|
required init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
init(numberOfPulse: Float = Float.infinity, radius: CGFloat, postion: CGPoint){
|
|
super.init()
|
|
self.backgroundColor = UIColor.black.cgColor
|
|
self.contentsScale = UIScreen.main.scale
|
|
self.opacity = 0
|
|
self.radius = radius
|
|
self.numebrOfPulse = numberOfPulse
|
|
self.position = postion
|
|
|
|
self.bounds = CGRect(x: 0, y: 0, width: radius*2, height: radius*2)
|
|
self.cornerRadius = radius
|
|
|
|
DispatchQueue.global(qos: .default).async {
|
|
self.setupAnimationGroup()
|
|
DispatchQueue.main.async {
|
|
self.add(self.animationGroup, forKey: "pulse")
|
|
}
|
|
}
|
|
}
|
|
|
|
func scaleAnimation() -> CABasicAnimation {
|
|
let scaleAnimaton = CABasicAnimation(keyPath: "transform.scale.xy")
|
|
scaleAnimaton.fromValue = NSNumber(value: 0)
|
|
scaleAnimaton.toValue = NSNumber(value: 1)
|
|
scaleAnimaton.duration = animationDuration
|
|
return scaleAnimaton
|
|
}
|
|
|
|
func createOpacityAnimation() -> CAKeyframeAnimation {
|
|
let opacityAnimiation = CAKeyframeAnimation(keyPath: "opacity")
|
|
opacityAnimiation.duration = animationDuration
|
|
opacityAnimiation.values = [0.4,0.8,0]
|
|
opacityAnimiation.keyTimes = [0,0.3,1]
|
|
return opacityAnimiation
|
|
}
|
|
|
|
func setupAnimationGroup() {
|
|
self.animationGroup.duration = animationDuration
|
|
self.animationGroup.repeatCount = numebrOfPulse
|
|
let defaultCurve = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default)
|
|
self.animationGroup.timingFunction = defaultCurve
|
|
self.animationGroup.animations = [scaleAnimation(),createOpacityAnimation()]
|
|
}
|
|
|
|
|
|
}
|