// // DropShawdowViewController.swift // VDSSample // // Created by Matt Bruce on 6/13/23. // import Foundation import UIKit import VDS import VDSColorTokens import Combine class DropShadowViewController: BaseViewController { var shadowLightColor: UIColor.VDSColor = .backgroundPrimaryDark { didSet { updateView() }} var shadowDarkColor: UIColor.VDSColor = .backgroundPrimaryLight { didSet { updateView() }} var viewLightColor: UIColor.VDSColor = .paletteGray65 { didSet { updateView() }} var viewDarkColor: UIColor.VDSColor = .backgroundPrimaryLight { didSet { updateView() }} var viewPaddingRange = Slider() var viewRadiusRange = Slider() var opacityRange = Slider() var radiusRange = Slider() var offsetXRange = Slider() var offsetYRange = Slider() var viewSpacerRange = Slider() var viewSize: CGFloat = 100.0 var componentWrapper: UIView! var componentConstraints: NSLayoutConstraint.Container! var secondView = View() var thirdView = View() lazy var dropShadowLightColorPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) }() lazy var dropShadowDarkColorPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) }() lazy var viewLightColorPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) }() lazy var viewDarkColorPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) }() var spacer: CGFloat = 10 { didSet { spacings.forEach{ $0.constant = spacer } } } var viewPadding: CGFloat = 0 { didSet { componentConstraints.topConstraint?.constant = viewPadding componentConstraints.leadingConstraint?.constant = viewPadding componentConstraints.trailingConstraint?.constant = -viewPadding componentConstraints.bottomConstraint?.constant = -viewPadding } } var spacings = [NSLayoutConstraint]() override func viewDidLoad() { super.viewDidLoad() let wrapper = UIView.makeWrapperWithConstraints(for: component, isTrailing: false) componentWrapper = wrapper.view componentConstraints = wrapper.container contentTopView.addSubview(secondView) contentTopView.addSubview(thirdView) contentTopView.addSubview(componentWrapper) component.width(viewSize).height(viewSize) secondView.width(viewSize).height(viewSize) thirdView.width(viewSize).height(viewSize) componentWrapper.pinTop().pinLeading() secondView.pinTop() thirdView.pinLeading().pinBottom() secondView.pinTrailingLessThanOrEqualTo(contentTopView.trailingAnchor) secondView.pinBottomLessThanOrEqualTo(contentTopView.bottomAnchor) thirdView.pinTrailingLessThanOrEqualTo(contentTopView.trailingAnchor) spacings.append(thirdView.topAnchor.constraint(equalTo: componentWrapper.bottomAnchor)) spacings.append(secondView.leadingAnchor.constraint(equalTo: componentWrapper.trailingAnchor)) spacings.forEach{ $0.isActive = true } viewPadding = 10 setupPicker() setupModel() updateView() } override func showDebug(show: Bool) { super.showDebug(show: show) component.debugBorder(show: false) componentWrapper.debugBorder(show: show, color: .green) secondView.debugBorder(show: show, color: .green) thirdView.debugBorder(show: show, color: .green) } override func setupForm(){ super.setupForm() addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Space Between Views", view: viewSpacerRange) addFormRow(label: "View Padding", view: viewPaddingRange) addFormRow(label: "View Corner Radius", view: viewRadiusRange) addFormRow(label: "View Light", view: viewLightColorPickerSelectorView) addFormRow(label: "View Dark", view: viewDarkColorPickerSelectorView) addFormRow(label: "Shawdow Light", view: dropShadowLightColorPickerSelectorView) addFormRow(label: "Shawdow Dark", view: dropShadowDarkColorPickerSelectorView) addFormRow(label: "Opacity", view: opacityRange) addFormRow(label: "Radius (Blur)", view: radiusRange) addFormRow(label: "Width (OffSet X)", view: offsetXRange) addFormRow(label: "Height (Offset Y)", view: offsetYRange) opacityRange.maximumValue = 1.0 opacityRange.minimumValue = 0.0 opacityRange.value = 1.0 opacityRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.updateView() }).store(in: &subscribers) radiusRange.maximumValue = 20.0 radiusRange.minimumValue = 0.0 radiusRange.value = 2.0 radiusRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.updateView() }).store(in: &subscribers) offsetXRange.maximumValue = 20 offsetXRange.minimumValue = -20 offsetXRange.value = 2.0 offsetXRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.updateView() }).store(in: &subscribers) offsetYRange.maximumValue = 20 offsetYRange.minimumValue = -20 offsetYRange.value = 2.0 offsetYRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.updateView() }).store(in: &subscribers) viewPaddingRange.maximumValue = 50.0 viewPaddingRange.minimumValue = 0.0 viewPaddingRange.value = 2.0 viewPaddingRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.viewPadding = CGFloat(slider.value) self?.updateView() }).store(in: &subscribers) viewRadiusRange.maximumValue = Float(viewSize / 2) viewRadiusRange.minimumValue = 0 viewRadiusRange.value = 8.0 viewRadiusRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.updateView() }).store(in: &subscribers) viewSpacerRange.maximumValue = 50 viewSpacerRange.minimumValue = 0 viewSpacerRange.value = 10.0 viewSpacerRange.publisher(for: .valueChanged).sink(receiveValue: { [weak self] slider in self?.spacer = CGFloat(slider.value) }).store(in: &subscribers) dropShadowLightColorPickerSelectorView.text = shadowLightColor.rawValue dropShadowDarkColorPickerSelectorView.text = shadowDarkColor.rawValue viewLightColorPickerSelectorView.text = viewLightColor.rawValue viewDarkColorPickerSelectorView.text = viewDarkColor.rawValue } func setupModel() { //setup UI surfacePickerSelectorView.text = component.surface.rawValue } override func updateView() { let surface = surfacePickerSelectorView.selectedItem let dropshadowColor = SurfaceColorConfiguration(shadowLightColor.uiColor, shadowDarkColor.uiColor).getColor(surface) let viewColor = SurfaceColorConfiguration(viewLightColor.uiColor, viewDarkColor.uiColor).getColor(surface) secondView.backgroundColor = .red thirdView.backgroundColor = .purple component.layer.cornerRadius = CGFloat(viewRadiusRange.value) component.layer.masksToBounds = false component.backgroundColor = viewColor component.layer.shadowColor = dropshadowColor.cgColor component.layer.shadowOpacity = Float(opacityRange.value) component.layer.shadowOffset = .init(width: CGFloat(offsetXRange.value), height: CGFloat(offsetYRange.value)) component.layer.shadowRadius = CGFloat(radiusRange.value) } func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.contentTopView.backgroundColor = item.color self?.updateView() } dropShadowDarkColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.shadowDarkColor = item } dropShadowLightColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.shadowLightColor = item } viewLightColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.viewLightColor = item } viewDarkColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.viewDarkColor = item } } }