From a07fc10a7e5401cd902bca70330ab8865c7cec95 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 9 Sep 2022 12:52:34 -0500 Subject: [PATCH] udpated swatch Signed-off-by: Matt Bruce --- VDS/Components/RadioSwatch/RadioSwatch.swift | 49 ++++++++++++++++--- .../RadioSwatch/RadioSwatchModel.swift | 4 +- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/VDS/Components/RadioSwatch/RadioSwatch.swift b/VDS/Components/RadioSwatch/RadioSwatch.swift index 33f385db..6cd66f90 100644 --- a/VDS/Components/RadioSwatch/RadioSwatch.swift +++ b/VDS/Components/RadioSwatch/RadioSwatch.swift @@ -32,12 +32,13 @@ open class RadioSwatchBase: Control, Cha } }() - public var fillView: UIView = { - return UIView().with { + public var fillView: UIImageView = { + return UIImageView().with { $0.translatesAutoresizingMaskIntoConstraints = false + $0.contentMode = .scaleAspectFit } }() - + public var onChange: Blocks.ActionBlock? //can't bind to @Proxy @@ -168,7 +169,7 @@ open class RadioSwatchBase: Control, Cha private var selectorBorderWidth: CGFloat = 1.0 public let swatchSize = CGSize(width: 48, height: 48) public let fillSize = CGSize(width: 36, height: 36) - + public let disabledAlpha = 0.5 private var radioSwatchBackgroundColorConfiguration: BinaryDisabledSurfaceColorConfiguration = { return BinaryDisabledSurfaceColorConfiguration().with { $0.forFalse.enabled.lightColor = VDSFormControlsColor.backgroundOnlight @@ -210,6 +211,7 @@ open class RadioSwatchBase: Control, Cha /// Manages the appearance of the radioSwatch. private var shapeLayer: CAShapeLayer? + private var gradientLayer: CAGradientLayer? open func getSelectorSize() -> CGSize { return swatchSize @@ -226,12 +228,35 @@ open class RadioSwatchBase: Control, Cha selectorView.layer.borderWidth = viewModel.selected ? selectorBorderWidth : 0 selectorView.layer.masksToBounds = true - var fillColor: UIColor = viewModel.primaryColor ?? .white - fillView.backgroundColor = fillColor + gradientLayer?.removeFromSuperlayer() + gradientLayer = nil + + var fillColorBackground: UIColor = .clear + + if let fillImage = viewModel.fillImage { + fillView.image = viewModel.disabled ? fillImage.image(alpha: disabledAlpha) : fillImage + + } else { + fillView.image = nil + if let primary = viewModel.primaryColor, let secondary = viewModel.secondaryColor { + let firstColor = viewModel.disabled ? primary.withAlphaComponent(disabledAlpha) : primary + let secondColor = viewModel.disabled ? secondary.withAlphaComponent(disabledAlpha) : secondary + let gradient = CAGradientLayer() + gradientLayer = gradient + gradient.frame = fillView.bounds + gradient.colors = [secondColor.cgColor, secondColor.cgColor, firstColor.cgColor, firstColor.cgColor] + gradient.locations = [NSNumber(value: 0.0), NSNumber(value: 0.5), NSNumber(value: 0.5), NSNumber(value: 1.0)] + gradient.transform = CATransform3DMakeRotation(135.0 / 180.0 * .pi, 0.0, 0.0, 1.0) + fillView.layer.addSublayer(gradient) + } else { + fillColorBackground = viewModel.primaryColor ?? .white + } + } + fillView.backgroundColor = viewModel.disabled ? fillColorBackground.withAlphaComponent(disabledAlpha) : fillColorBackground fillView.layer.borderColor = fillBorderColor.cgColor fillView.layer.cornerRadius = fillView.bounds.width * 0.5 fillView.layer.borderWidth = selectorBorderWidth - + fillView.layer.masksToBounds = true setNeedsDisplay() } @@ -270,3 +295,13 @@ open class RadioSwatchBase: Control, Cha } } } + +extension UIImage { + func image(alpha: CGFloat) -> UIImage? { + UIGraphicsBeginImageContextWithOptions(size, false, scale) + draw(at: .zero, blendMode: .normal, alpha: alpha) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return newImage + } +} diff --git a/VDS/Components/RadioSwatch/RadioSwatchModel.swift b/VDS/Components/RadioSwatch/RadioSwatchModel.swift index b9858e90..de1097f7 100644 --- a/VDS/Components/RadioSwatch/RadioSwatchModel.swift +++ b/VDS/Components/RadioSwatch/RadioSwatchModel.swift @@ -9,7 +9,7 @@ import Foundation import UIKit public protocol RadioSwatchModel: Modelable, FormFieldable, DataTrackable, Accessable, Selectable, BinaryColorable, Equatable { - var fillImage: String? { get set } + var fillImage: UIImage? { get set } var primaryColor: UIColor? { get set } var secondaryColor: UIColor? { get set } var text: String { get set } @@ -41,7 +41,7 @@ public struct DefaultRadioSwatchModel: RadioSwatchModel { public var selected: Bool = false - public var fillImage: String? + public var fillImage: UIImage? public var primaryColor: UIColor? public var secondaryColor: UIColor? public var text: String = ""