128 lines
4.5 KiB
Swift
128 lines
4.5 KiB
Swift
//
|
|
// SeismicNetworkBaseTableViewCell.swift
|
|
// Earthquake Network
|
|
//
|
|
// Created by Andrea Busi on 06/03/25.
|
|
// Copyright © 2025 Earthquake Network. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Shogun
|
|
|
|
protocol SeismicNetworkBaseTableViewCellDelegate: AnyObject {
|
|
func seismicNetworkCellDidTapShare(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapMap(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapMapDetail(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapIntensityMapDetail(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapCalendar(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapSettings(_ cell: SeismicNetworkBaseTableViewCell)
|
|
func seismicNetworkCellDidTapClose(_ cell: SeismicNetworkBaseTableViewCell)
|
|
}
|
|
|
|
|
|
class SeismicNetworkBaseTableViewCell: UITableViewCell {
|
|
|
|
/// Delegate
|
|
weak var delegate: SeismicNetworkBaseTableViewCellDelegate?
|
|
|
|
/// Available informations to display inside the cell
|
|
enum InformationType: Int {
|
|
case preliminary
|
|
case time
|
|
case distance
|
|
case coordinate
|
|
case population
|
|
case realtimeSmartphones
|
|
case reportUsers
|
|
case intensityMap
|
|
case buttons
|
|
}
|
|
|
|
// MARL: - Internal
|
|
|
|
static let DefaultButtonHeight: CGFloat = 34.0
|
|
static let VerticalSpacingDefault: CGFloat = 6.0
|
|
static let VerticalSpacingSmall: CGFloat = 2.0
|
|
static let HorizontalSpacingDefault: CGFloat = 4.0
|
|
|
|
// MARK: - UI Components
|
|
|
|
lazy var containerView: UIView = {
|
|
let view = UIView(frame: .zero)
|
|
view.translatesAutoresizingMaskIntoConstraints = false
|
|
view.backgroundColor = .white
|
|
view.clipsToBounds = true
|
|
return view
|
|
}()
|
|
|
|
lazy var gradientView: UIImageView = {
|
|
// Per gestire il gradiente, utilizziamo una image view in cui inseriamo un'immagine
|
|
// creata ad-hoc con il gradiente desiderato.
|
|
// Le prove fatte utilizzando una view normale sono fallite perchè al momento di
|
|
// disegnare la view non abbiamo le misure corrette.
|
|
let view = UIImageView(frame: .zero)
|
|
view.translatesAutoresizingMaskIntoConstraints = false
|
|
view.contentMode = .scaleToFill
|
|
return view
|
|
}()
|
|
|
|
// MARK: - Init
|
|
|
|
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
|
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
|
setupUI()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
super.init(coder: coder)
|
|
setupUI()
|
|
}
|
|
|
|
// MARK: - View Lifecycle
|
|
|
|
override func layoutSubviews() {
|
|
super.layoutSubviews()
|
|
|
|
containerView.eqn_applyShadowAndRoundedCorners()
|
|
gradientView.eqn_applyRoundedCorners()
|
|
}
|
|
|
|
// MARK: - Setup
|
|
|
|
func setupUI() {
|
|
selectionStyle = .default
|
|
backgroundColor = .clear
|
|
|
|
// container view
|
|
contentView.addSubview(containerView)
|
|
containerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 4.0).isActive = true
|
|
containerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8.0).isActive = true
|
|
containerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8.0).isActive = true
|
|
containerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -4.0).isActive = true
|
|
|
|
containerView.addSubview(gradientView)
|
|
gradientView.constraint(to: containerView)
|
|
}
|
|
|
|
func recreateUI() {
|
|
// remove all subviews and recreate the required components
|
|
containerView.subviews.forEach({ $0.removeFromSuperview() })
|
|
setupUI()
|
|
}
|
|
|
|
@discardableResult
|
|
func addSeparator(constraintTo: NSLayoutYAxisAnchor, constanst: CGFloat = 8.0) -> UIView {
|
|
let separator = UIView()
|
|
separator.translatesAutoresizingMaskIntoConstraints = false
|
|
separator.backgroundColor = .lightGray
|
|
containerView.addSubview(separator)
|
|
|
|
separator.topAnchor.constraint(equalTo: constraintTo, constant: constanst).isActive = true
|
|
separator.leadingAnchor.constraint(equalTo: containerView.layoutMarginsGuide.leadingAnchor).isActive = true
|
|
separator.trailingAnchor.constraint(equalTo: containerView.layoutMarginsGuide.trailingAnchor).isActive = true
|
|
separator.heightAnchor.constraint(equalToConstant: 1.0).isActive = true
|
|
|
|
return separator
|
|
}
|
|
}
|