161 lines
5.2 KiB
Swift
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)
|
|
}
|
|
}
|