// // Icon.swift // VDS // // Created by Matt Bruce on 1/9/23. // import Foundation import UIKit import VDSColorTokens import Combine @objc(VDSIcon) open class Icon: View { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- private var widthConstraint: NSLayoutConstraint? private var heightConstraint: NSLayoutConstraint? //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- open var imageView = UIImageView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.setContentCompressionResistancePriority(.required, for: .vertical) $0.setContentCompressionResistancePriority(.required, for: .horizontal) $0.contentMode = .scaleAspectFill $0.clipsToBounds = true } open var color: UIColor = VDSColor.paletteBlack { didSet { if let hex = color.hexString, !UIColor.isVDSColor(color: color) { print("icon.color is not a VDSColor. Hex: \(hex) is not a supported color") } setNeedsUpdate() } } open var size: Size = .medium { didSet { setNeedsUpdate() }} open var name: Name? { didSet { setNeedsUpdate() }} open var customSize: Int? { didSet { setNeedsUpdate() }} //functions //-------------------------------------------------- // MARK: - Lifecycle //-------------------------------------------------- open override func setup() { super.setup() addSubview(imageView) imageView.pinToSuperView() heightConstraint = imageView.heightAnchor.constraint(equalToConstant: size.dimensions.height) heightConstraint?.isActive = true widthConstraint = imageView.widthAnchor.constraint(equalToConstant: size.dimensions.width) widthConstraint?.isActive = true backgroundColor = .clear isAccessibilityElement = true accessibilityTraits = .image } /// Resets to default settings. open override func reset() { super.reset() color = VDSColor.paletteBlack imageView.image = nil } /// Function used to make changes to the View based off a change events or from local properties. open override func updateView() { super.updateView() //get the color for the image var imageColor = color //ensure the correct color for white/black colors if surface == .dark && color == VDSColor.paletteBlack { imageColor = VDSColor.elementsPrimaryOndark } else if surface == .light && color == VDSColor.paletteBlack { imageColor = VDSColor.elementsPrimaryOnlight } //set the icon dimensions var dimensions = size.dimensions if let customSize { dimensions = .init(width: customSize, height: customSize) } heightConstraint?.constant = dimensions.height widthConstraint?.constant = dimensions.width //get the image name //set the image if let name, let image = getImage(for: name.rawValue) { setImage(image: image, imageColor: imageColor) } else { imageView.image = nil } } private func getImage(for imageName: String) -> UIImage? { return BundleManager.shared.image(for: imageName) } private func setImage(image: UIImage, imageColor: UIColor) { imageView.image = image.withTintColor(imageColor) } }