// // EQNBaseContainerTableViewCell.swift // Earthquake Network // // Created by Andrea Busi on 14/06/24. // Copyright © 2024 Earthquake Network. All rights reserved. // import UIKit import Shogun extension CGFloat { fileprivate static let cardVerticalMargin: CGFloat = 4.0 fileprivate static let cardHorizontalMargin: CGFloat = 8.0 /// Padding between the card border and the internal content static let cardPadding: CGFloat = 8.0 /// Spacing between items inside a card static let cardVerticalSpacing: CGFloat = 10.0 } class EQNBaseContainerTableViewCell: UITableViewCell { // MARK: - UI private lazy var internalContainerView: UIView = { let view = UIView(frame: .zero) view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = .white return view }() private lazy var chevronView: UIImageView = { let imageView = UIImageView(image: .init(systemName: "chevron.right")) imageView.translatesAutoresizingMaskIntoConstraints = false imageView.contentMode = .scaleAspectFit imageView.tintColor = AppTheme.Colors.lightGray return imageView }() lazy var containerView: UIView = { let view = UIView(frame: .zero) view.translatesAutoresizingMaskIntoConstraints = false return view }() private lazy var headerLabel: UILabel = { let label = EQNEdgeInsetLabel() label.translatesAutoresizingMaskIntoConstraints = false label.backgroundColor = AppTheme.Colors.lightBlue label.font = .systemFont(ofSize: 17.0, weight: .medium) label.textColor = .white return label }() private lazy var emptyTopView: UIView = { let view = UIView(frame: .zero) view.backgroundColor = .clear return view }() /// Returns the top view to use to attach descendant constraints var topView: UIView { isHeaderVisible ? headerLabel : emptyTopView } /// If `true` an header on the top left corner will be visible var isHeaderVisible: Bool { true } /// If `true` a right chevron is displayed on right side var isRightArrowVisbile: Bool { false } /// Text to display inside the header var headerText: String { "" } override var backgroundColor: UIColor? { set { internalContainerView.backgroundColor = newValue } get { internalContainerView.backgroundColor } } // MARK: - Init override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setupUI() updateUI() } required init?(coder: NSCoder) { super.init(coder: coder) setupUI() updateUI() } // MARK: - View Lifecycle override func layoutSubviews() { super.layoutSubviews() containerView.eqn_applyRoundedCorners() internalContainerView.eqn_applyShadowAndRoundedCorners() } // MARK: - Internal func setupUI() { selectionStyle = .default super.backgroundColor = .clear contentView.addSubview(internalContainerView) internalContainerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: .cardVerticalMargin).isActive = true internalContainerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: .cardHorizontalMargin.negative).isActive = true internalContainerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: .cardHorizontalMargin).isActive = true internalContainerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: .cardVerticalMargin.negative).isActive = true internalContainerView.addSubview(containerView) containerView.topAnchor.constraint(equalTo: internalContainerView.topAnchor).isActive = true containerView.leadingAnchor.constraint(equalTo: internalContainerView.leadingAnchor).isActive = true containerView.bottomAnchor.constraint(equalTo: internalContainerView.bottomAnchor).isActive = true if isRightArrowVisbile { contentView.addSubview(chevronView) chevronView.centerYAnchor.constraint(equalTo: internalContainerView.centerYAnchor).isActive = true chevronView.trailingAnchor.constraint(equalTo: internalContainerView.trailingAnchor, constant: .cardPadding.negative).isActive = true chevronView.heightAnchor.constraint(equalToConstant: 24.0).isActive = true chevronView.widthAnchor.constraint(equalTo: chevronView.heightAnchor).isActive = true containerView.trailingAnchor.constraint(equalTo: chevronView.leadingAnchor, constant: .cardPadding.negative).isActive = true } else { containerView.trailingAnchor.constraint(equalTo: internalContainerView.trailingAnchor).isActive = true } if isHeaderVisible { containerView.addSubview(headerLabel) headerLabel.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true headerLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true headerLabel.heightAnchor.constraint(equalToConstant: 26.0).isActive = true } else { containerView.addSubview(emptyTopView) emptyTopView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true emptyTopView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true emptyTopView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true emptyTopView.heightAnchor.constraint(equalToConstant: 0.0).isActive = true } } func updateUI() { // setup titles, colors and UI stuff here headerLabel.text = headerText.firstCharacterCapitalized } }