// // 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.. 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 } }