vds_ios/VDS/Components/Label/Attributes/ImageLabelAttribute.swift
Matt Bruce 1d3431da2c updated frame
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2023-04-14 16:28:05 -05:00

78 lines
2.4 KiB
Swift

//
// LabelSystemImageLabelAttribute.swift
// VDS
//
// Created by Matt Bruce on 10/4/22.
//
import Foundation
import UIKit
public struct ImageLabelAttribute: AttachmentLabelAttributeModel {
//--------------------------------------------------
// MARK: - Enums
//--------------------------------------------------
public enum Error: Swift.Error {
case bundleNotFound
case imageNotFound(String)
case imageNotSet
}
//--------------------------------------------------
// MARK: - Public Properties
//--------------------------------------------------
public var id = UUID()
public var location: Int
public var length: Int = 1
public var imageName: String?
public var image: UIImage?
public var frame: CGRect?
public var tintColor: UIColor?
//--------------------------------------------------
// MARK: - Equatable
//--------------------------------------------------
public static func == (lhs: ImageLabelAttribute, rhs: ImageLabelAttribute) -> Bool {
lhs.isEqual(rhs)
}
public func isEqual(_ equatable: ImageLabelAttribute) -> Bool {
return id == equatable.id && range == equatable.range && imageName == equatable.imageName
}
//--------------------------------------------------
// MARK: - Private Functions
//--------------------------------------------------
private func imageAttachment(image: UIImage) -> NSTextAttachment {
let attachment = NSTextAttachment()
attachment.image = tintColor != nil ? image.withTintColor(tintColor!) : image
if let frame {
attachment.bounds = frame
}
return attachment
}
//--------------------------------------------------
// MARK: - Public Functions
//--------------------------------------------------
public func getAttachment() throws -> NSTextAttachment {
//get a local asset
if let imageName {
guard let image = BundleManager.shared.image(for: imageName) else {
throw Error.imageNotFound(imageName)
}
return imageAttachment(image: image)
} //get from set image
else if let image {
return imageAttachment(image: image)
} else {
throw Error.imageNotSet
}
}
}