Files

124 lines
4.0 KiB
Swift

//
// BackgroundCircles.swift
// PrivadoVPN
//
// Created by Lizaveta Malinouskaya on 6/18/21.
// Copyright © 2021 Privado LLC. All rights reserved.
//
import UIKit
public class BackgroundCircles: UIView {
enum Constants {
enum Geometry {
static let viewHeight: CGFloat = 1250
}
enum Image {
static let logo = "create.logo.dark"
}
}
private var numberOfCircles: Int = 0
private var multiplier: CGFloat = 0 {
didSet {
if multiplier <= 0 {
multiplier = 1.20
} else if multiplier < 1 {
multiplier = abs(1 / multiplier)
}
setOffset()
}
}
private var circlesAlpha: CGFloat = 0.04
private var parent: UIView?
private var circles: [UIView] = []
private var circleRadiuses: [CGFloat] = []
private var offset: CGFloat = 104
init(numberOfCircles: Int = 5, multiplier: CGFloat = 1.2, alpha: CGFloat = 0.05) {
super.init(frame: .zero)
self.frame = CGRect(x: 0, y: 0, width: Constants.Geometry.viewHeight, height: Constants.Geometry.viewHeight)
self.numberOfCircles = numberOfCircles
self.multiplier = multiplier
self.circlesAlpha = alpha
configureUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configureUI() {
setOffset()
initializeRadiuses()
for radius in circleRadiuses {
circles.append(initializeGradientCircle(with: self, radius: radius, alpha: circlesAlpha))
}
self.layer.cornerRadius = self.bounds.height / 2
for (circle, radius) in zip(circles, circleRadiuses) {
NSLayoutConstraint.activate([
circle.centerXAnchor.constraint(equalTo: self.centerXAnchor),
circle.centerYAnchor.constraint(equalTo: self.centerYAnchor),
circle.widthAnchor.constraint(equalToConstant: 2 * radius),
circle.heightAnchor.constraint(equalToConstant: 2 * radius)
])
}
let image = self.initializeLogoImage(with: self)
NSLayoutConstraint.activate([
image.centerXAnchor.constraint(equalTo: self.centerXAnchor),
image.centerYAnchor.constraint(equalTo: self.centerYAnchor)
])
}
private func initializeRadiuses() {
var radius = self.bounds.height/2
for _ in 0..<self.numberOfCircles {
circleRadiuses.append(radius)
radius = calculateNewRadius(of: radius, with: self.offset)
}
}
private func initializeLogoImage(with container: UIView) -> UIImageView {
let image = UIImage(imageLiteralResourceName: Constants.Image.logo)
let view = UIImageView(image: image)
view.translatesAutoresizingMaskIntoConstraints = false
view.contentMode = .scaleAspectFit
container.addSubview(view)
return view
}
private func calculateNewRadius(of circleRadius: CGFloat, with offset: CGFloat) -> CGFloat {
if circleRadius > offset {
return (circleRadius - offset)
} else {
return 0
}
}
private func setOffset() {
offset = Constants.Geometry.viewHeight / 2 * (multiplier - 1) / multiplier
}
private func initializeGradientCircle(with container: UIView, radius: CGFloat, alpha: CGFloat) -> UIView {
let gradientView = GradientView()
gradientView.translatesAutoresizingMaskIntoConstraints = false
gradientView.cornerRadius = radius
gradientView.horizontalMode = false
gradientView.stops = [
.init(color: Colors.AnimationBackgrounds.loadingCircleTop.color, location: 0),
.init(color: Colors.AnimationBackgrounds.loadingCircleBottom.color, location: 1)
]
gradientView.backgroundColor = .red
gradientView.alpha = alpha
container.addSubview(gradientView)
return gradientView
}
}