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