Files
eqn.ios/Sources/Earthquake Network/UI/EQNSeismicAnnotationView.swift
T
2024-06-23 16:24:31 +02:00

161 lines
5.2 KiB
Swift

//
// EQNSeismicAnnotationView.swift
// Earthquake Network
//
// Created by Andrea Busi on 21/06/24.
// Copyright © 2024 Earthquake Network. All rights reserved.
//
import UIKit
import MapKit
class EQNSeismicAnnotationView: MKAnnotationView {
static let IdentifierFull = "EQNSeismicAnnotationViewFull"
static let IdentifierLight = "EQNSeismicAnnotationViewLight"
static let IdentifierCircle = "EQNSeismicAnnotationViewCircle"
private static let LabelHeight: CGFloat = 15.0
private static let MagnitudeHeight: CGFloat = 25.0
private static let MagnitudeWidth: CGFloat = 45.0
private static let FullViewHeight: CGFloat = MagnitudeHeight + 2*LabelHeight
private static let FullViewWidth: CGFloat = 100.0
private static let SmallViewHeight: CGFloat = MagnitudeHeight
private static let SmallViewWidth: CGFloat = 100.0
static let CircleViewHeight: CGFloat = 20.0
// MARK: - Public
var title: String? {
set { labelTop.text = newValue }
get { labelTop.text }
}
var subtitle: String? {
set { labelBottom.text = newValue }
get { labelBottom.text }
}
var magnitude: String? {
set { magnitudeLabel.text = newValue }
get { magnitudeLabel.text }
}
var magnitudeColor: UIColor {
set { magnitudeLabel.textColor = newValue }
get { magnitudeLabel.textColor }
}
var isUserSelection: Bool = false {
didSet {
magnitudeView.layer.borderColor = isUserSelection ? AppTheme.Colors.red.cgColor : AppTheme.Colors.darkGray.cgColor
magnitudeView.layer.borderWidth = isUserSelection ? 2.0 : 1.0
}
}
@objc public override var image: UIImage? {
set { imageView.image = newValue }
get { imageView.image }
}
// MARK: - UI
private lazy var imageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
return imageView
}()
private lazy var magnitudeView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = 6.0
view.layer.borderWidth = 1.0
view.layer.borderColor = AppTheme.Colors.darkGray.cgColor
view.clipsToBounds = true
return view
}()
private lazy var magnitudeLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 12, weight: .bold)
label.textAlignment = .center
label.textColor = AppTheme.Colors.lightBlue
return label
}()
private lazy var labelTop: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 11, weight: .semibold)
label.textAlignment = .center
return label
}()
private lazy var labelBottom: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 11, weight: .semibold)
label.textAlignment = .center
return label
}()
// MARK: - Init
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
backgroundColor = .clear
if reuseIdentifier == Self.IdentifierFull {
frame = CGRect(x: 0, y: 0, width: Self.FullViewWidth, height: Self.FullViewHeight)
setupFullUI()
} else if reuseIdentifier == Self.IdentifierLight {
frame = CGRect(x: 0, y: 0, width: Self.SmallViewWidth, height: Self.SmallViewHeight)
setupLightUI()
} else if reuseIdentifier == Self.IdentifierCircle {
frame = CGRect(x: 0, y: 0, width: Self.CircleViewHeight, height: Self.CircleViewHeight)
setupCircleUI()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Private
private func setupFullUI() {
let labelTopFrame = CGRect(x: 0, y: 0, width: frame.width, height: Self.LabelHeight)
labelTop.frame = labelTopFrame
addSubview(labelTop)
magnitudeView.frame = CGRect(x: 0, y: 0, width: Self.MagnitudeWidth, height: Self.MagnitudeHeight)
magnitudeView.center = center
addSubview(magnitudeView)
magnitudeLabel.frame = magnitudeView.bounds
magnitudeLabel.center = magnitudeView.center
addSubview(magnitudeLabel)
labelBottom.frame = CGRect(x: 0, y: magnitudeView.frame.maxY, width: frame.width, height: Self.LabelHeight)
addSubview(labelBottom)
}
private func setupLightUI() {
magnitudeView.frame = CGRect(x: 0, y: 0, width: Self.MagnitudeWidth, height: Self.MagnitudeHeight)
magnitudeView.center = center
addSubview(magnitudeView)
magnitudeLabel.frame = magnitudeView.bounds
magnitudeLabel.center = magnitudeView.center
addSubview(magnitudeLabel)
}
private func setupCircleUI() {
imageView.frame = CGRect(x: 0, y: 0, width: Self.CircleViewHeight, height: Self.CircleViewHeight)
imageView.center = center
addSubview(imageView)
}
}