From 349ddf6ccee766c35b4f09a647b81cad0b8afd2f Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 17 Nov 2022 14:29:57 -0600 Subject: [PATCH 1/5] updated baseViewController, fixed issues with container controls for the examples Signed-off-by: Matt Bruce --- .../ViewControllers/BaseViewController.swift | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/VDSSample/ViewControllers/BaseViewController.swift b/VDSSample/ViewControllers/BaseViewController.swift index 23ee3b6..ea04a4e 100644 --- a/VDSSample/ViewControllers/BaseViewController.swift +++ b/VDSSample/ViewControllers/BaseViewController.swift @@ -16,13 +16,11 @@ public class BaseViewController: UIViewController, Initable { } private let edgeSpacing = 16.0 - private let topBottomSpacing = 20.0 //-------------------------------------------------- // MARK: - Combine Properties //-------------------------------------------------- public var subscribers = Set() - public var firstRender: Bool = false //-------------------------------------------------- // MARK: - Properties @@ -83,7 +81,7 @@ public class BaseViewController: UIViewController, Initable { return UIStackView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.alignment = .fill - $0.distribution = .fillProportionally + $0.distribution = .fill $0.axis = .vertical $0.spacing = 10 } @@ -108,28 +106,35 @@ public class BaseViewController: UIViewController, Initable { embed(scrollViewController) scrollViewController.scrollView.alwaysBounceVertical = true scrollViewController.contentView = contentView + + let spacerView = UIView().with{ + $0.translatesAutoresizingMaskIntoConstraints = false + } + contentView.addSubview(contentTopView) contentView.addSubview(contentBottomView) + contentView.addSubview(spacerView) contentBottomView.addSubview(formStackView) - - contentTopView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: edgeSpacing).isActive = true - contentTopView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: edgeSpacing).isActive = true - contentTopView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -edgeSpacing).isActive = true - contentBottomView.topAnchor.constraint(equalTo: contentTopView.bottomAnchor, constant: edgeSpacing).isActive = true - contentBottomView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: edgeSpacing).isActive = true - contentBottomView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -edgeSpacing).isActive = true - contentBottomView.bottomAnchor.constraint(lessThanOrEqualTo: contentView.bottomAnchor, constant: -edgeSpacing).isActive = true - - formStackView.topAnchor.constraint(equalTo: contentBottomView.topAnchor, constant: edgeSpacing).isActive = true - formStackView.leadingAnchor.constraint(equalTo: contentBottomView.leadingAnchor, constant: edgeSpacing).isActive = true - formStackView.trailingAnchor.constraint(equalTo: contentBottomView.trailingAnchor, constant: -edgeSpacing).isActive = true - formStackView.bottomAnchor.constraint(equalTo: contentBottomView.bottomAnchor, constant: -100).isActive = true + contentTopView.pinTop(edgeSpacing) + contentTopView.pinLeading(edgeSpacing) + contentTopView.pinTrailing(edgeSpacing) + contentBottomView.pinTop(contentTopView.bottomAnchor, edgeSpacing) + contentBottomView.pinLeading(edgeSpacing) + contentBottomView.pinTrailing(edgeSpacing) + + spacerView + .pinTop(contentBottomView.bottomAnchor, 100) + .pinLeading() + .pinTrailing() + .pinBottom() + + formStackView.pinToSuperView() view.addSubview(picker) - picker.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true - picker.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true - picker.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true + picker.pinBottom() + picker.pinLeading() + picker.pinTrailing() picker.isHidden = true } @@ -144,20 +149,14 @@ public class BaseViewController: UIViewController, Initable { addChild(viewController) view.addSubview(viewController.view) viewController.view.translatesAutoresizingMaskIntoConstraints = false - viewController.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true - viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true + viewController.view.pinToSuperView() viewController.didMove(toParent: self) } open func addContentTopView(view: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false contentTopView.addSubview(view) - view.leadingAnchor.constraint(equalTo: contentTopView.leadingAnchor, constant: edgeSpacing).isActive = true - view.topAnchor.constraint(equalTo: contentTopView.topAnchor, constant: topBottomSpacing).isActive = true - - view.trailingAnchor.constraint(lessThanOrEqualTo: contentTopView.trailingAnchor, constant: -edgeSpacing).isActive = true - view.bottomAnchor.constraint(lessThanOrEqualTo: contentTopView.bottomAnchor, constant: -topBottomSpacing).isActive = true + view.pinToSuperView(.init(top: edgeSpacing, left: edgeSpacing, bottom: edgeSpacing, right: edgeSpacing)) } open func addFormRow(label: String, view: UIView, stackView: UIStackView? = nil) { From 5746a8d536bc35e8a0485a2f550e73f6083424cb Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 17 Nov 2022 14:30:21 -0600 Subject: [PATCH 2/5] fixed issue with base and now badge Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/BadgeViewController.swift | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/VDSSample/ViewControllers/BadgeViewController.swift b/VDSSample/ViewControllers/BadgeViewController.swift index c2324e9..67d1ab9 100644 --- a/VDSSample/ViewControllers/BadgeViewController.swift +++ b/VDSSample/ViewControllers/BadgeViewController.swift @@ -55,14 +55,7 @@ class BadgeViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(badge) - badge.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - badge.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - badge.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true - addContentTopView(view: view) - + addContentTopView(view: badge) setupForm() setupPicker() setupModel() From 8eca5ee691e593be740f0f90f58df6162afcf576 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 18 Nov 2022 10:00:25 -0600 Subject: [PATCH 3/5] added button group Signed-off-by: Matt Bruce --- VDSSample.xcodeproj/project.pbxproj | 4 + .../ButtonGroupViewController.swift | 123 ++++++++++++++++++ .../ViewControllers/MenuViewController.swift | 1 + 3 files changed, 128 insertions(+) create mode 100644 VDSSample/ViewControllers/ButtonGroupViewController.swift diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index dcaef57..ffa5ef5 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -59,6 +59,7 @@ EAA5EEAD28EB6924003B3210 /* TextEntryFieldViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAA5EEAC28EB6924003B3210 /* TextEntryFieldViewController.swift */; }; EAB1D2C928AAAA1D00DAE764 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2C828AAAA1D00DAE764 /* BaseViewController.swift */; }; EAB1D2D428AC409F00DAE764 /* LabelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2D328AC409F00DAE764 /* LabelViewController.swift */; }; + EAB5FEEF2927E28400998C17 /* ButtonGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB5FEEE2927E28400998C17 /* ButtonGroupViewController.swift */; }; EAC9258029119FC400091998 /* TextLinkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC9257F29119FC400091998 /* TextLinkViewController.swift */; }; EAF7F07D2899698800B287F5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EAF7F07B2899698800B287F5 /* Assets.xcassets */; }; EAF7F09C2899B92400B287F5 /* CheckboxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */; }; @@ -120,6 +121,7 @@ EAA5EEAC28EB6924003B3210 /* TextEntryFieldViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryFieldViewController.swift; sourceTree = ""; }; EAB1D2C828AAAA1D00DAE764 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; EAB1D2D328AC409F00DAE764 /* LabelViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelViewController.swift; sourceTree = ""; }; + EAB5FEEE2927E28400998C17 /* ButtonGroupViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonGroupViewController.swift; sourceTree = ""; }; EAC9257F29119FC400091998 /* TextLinkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextLinkViewController.swift; sourceTree = ""; }; EAF7F07B2899698800B287F5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxViewController.swift; sourceTree = ""; }; @@ -237,6 +239,7 @@ EA3C3BB228996775000CA526 /* MenuViewController.swift */, EAB1D2C828AAAA1D00DAE764 /* BaseViewController.swift */, EA4DB30328DCD25B00103EE3 /* BadgeViewController.swift */, + EAB5FEEE2927E28400998C17 /* ButtonGroupViewController.swift */, 5FC35BE828D5235A004EBEAC /* ButtonViewController.swift */, EA89204D28B67332006B9984 /* CheckBoxGroupViewController.swift */, EAF7F09B2899B92400B287F5 /* CheckboxViewController.swift */, @@ -392,6 +395,7 @@ buildActionMask = 2147483647; files = ( EA3C3BB728996775000CA526 /* ToggleViewController.swift in Sources */, + EAB5FEEF2927E28400998C17 /* ButtonGroupViewController.swift in Sources */, EA89204C28B66CE2006B9984 /* ScrollWrapperView.swift in Sources */, EA89205128B68307006B9984 /* TextField.swift in Sources */, EA3C3BB528996775000CA526 /* StoryboardInitable.swift in Sources */, diff --git a/VDSSample/ViewControllers/ButtonGroupViewController.swift b/VDSSample/ViewControllers/ButtonGroupViewController.swift new file mode 100644 index 0000000..670fef9 --- /dev/null +++ b/VDSSample/ViewControllers/ButtonGroupViewController.swift @@ -0,0 +1,123 @@ +// +// ButtonViewController.swift +// VDSSample +// +// Created by Jarrod Courtney on 9/16/22. +// + +import Foundation +import UIKit +import VDS +import VDSColorTokens + +class ButtonGroupViewController: BaseViewController { + var collectionView: UICollectionView! + + lazy var usePickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: [.primary, .secondary]) + }() + + lazy var buttonSizePickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: ButtonSize.allCases) + }() + + var disabledSwitch = UISwitch() + var textField = TextField() + var widthTextField = TextField() + + let buttonGroup = ButtonGroup() + + let button = Button() + + override func viewDidLoad() { + super.viewDidLoad() + buttonGroup.buttons = [ + button, + Button().with{$0.text = "Wide Label Button"}, + TextLink().with{$0.text = "Text Link Button"}, + TextLinkCaret().with{$0.text = "Caret Button"} + ] + + addContentTopView(view: buttonGroup) + + setupForm() + setupPicker() + setupModel() + } + + func setupForm(){ + addFormRow(label: "Surface", view: surfacePickerSelectorView) + addFormRow(label: "Use", view: usePickerSelectorView) + addFormRow(label: "Disabled", view: disabledSwitch) + addFormRow(label: "Label", view: textField) + addFormRow(label: "Width", view: widthTextField) + addFormRow(label: "Size", view: buttonSizePickerSelectorView) + + + disabledSwitch + .publisher(for: .valueChanged) + .sink { [weak self] sender in + self?.buttonGroup.disabled = sender.isOn + }.store(in: &subscribers) + + textField + .textPublisher + .sink { [weak self] text in + self?.button.text = text + }.store(in: &subscribers) + + widthTextField + .textPublisher + .sink { [weak self] text in + if let n = NumberFormatter().number(from: text) { + self?.button.width = CGFloat(truncating: n) + } + }.store(in: &subscribers) + + } + + func setupModel() { + button.text = "Button" + + button + .publisher(for: .touchUpInside) + .sink { [weak self] control in + let alertController:UIAlertController = UIAlertController(title: "Alert", + message: "\(control.text!) Clicked", + preferredStyle: UIAlertController.Style.alert) + alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler:nil)) + self?.present(alertController, animated: true) + print("clicked me") + }.store(in: &subscribers) + + + //setup UI + surfacePickerSelectorView.text = buttonGroup.surface.rawValue + disabledSwitch.isOn = buttonGroup.disabled + textField.text = button.text + usePickerSelectorView.text = button.use.rawValue + widthTextField.text = "" + buttonSizePickerSelectorView.text = ButtonSize.large.rawValue + } + + func setupPicker(){ + + surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.buttonGroup.surface = item + self?.contentTopView.backgroundColor = item.color + } + + usePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.button.use = item + self?.button.backgroundColor = item.color + } + + buttonSizePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.button.size = item + } + } +} diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index 8abd80b..970cf08 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -26,6 +26,7 @@ class MenuViewController: UITableViewController { let items: [MenuComponent] = [ MenuComponent(title: "Badge", viewController: BadgeViewController.self), MenuComponent(title: "Button", viewController: ButtonViewController.self), + MenuComponent(title: "ButtonGroup", viewController: ButtonGroupViewController.self), MenuComponent(title: "Checkbox", viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxGroup", viewController: CheckboxGroupViewController.self), MenuComponent(title: "Label", viewController: LabelViewController.self), From 4dc88997561e393686f9e73d9aeb2a32c0652a8c Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 18 Nov 2022 10:14:45 -0600 Subject: [PATCH 4/5] updated buttongroup Signed-off-by: Matt Bruce --- .../ButtonGroupViewController.swift | 56 ++++++------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/VDSSample/ViewControllers/ButtonGroupViewController.swift b/VDSSample/ViewControllers/ButtonGroupViewController.swift index 670fef9..a580d31 100644 --- a/VDSSample/ViewControllers/ButtonGroupViewController.swift +++ b/VDSSample/ViewControllers/ButtonGroupViewController.swift @@ -13,24 +13,16 @@ import VDSColorTokens class ButtonGroupViewController: BaseViewController { var collectionView: UICollectionView! - lazy var usePickerSelectorView = { - PickerSelectorView(title: "", - picker: self.picker, - items: [.primary, .secondary]) - }() - - lazy var buttonSizePickerSelectorView = { - PickerSelectorView(title: "", - picker: self.picker, - items: ButtonSize.allCases) + lazy var buttonPositionSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: ButtonPosition.allCases) }() var disabledSwitch = UISwitch() - var textField = TextField() var widthTextField = TextField() let buttonGroup = ButtonGroup() - let button = Button() override func viewDidLoad() { @@ -51,11 +43,10 @@ class ButtonGroupViewController: BaseViewController { func setupForm(){ addFormRow(label: "Surface", view: surfacePickerSelectorView) - addFormRow(label: "Use", view: usePickerSelectorView) addFormRow(label: "Disabled", view: disabledSwitch) - addFormRow(label: "Label", view: textField) - addFormRow(label: "Width", view: widthTextField) - addFormRow(label: "Size", view: buttonSizePickerSelectorView) + addFormRow(label: "Position", view: buttonPositionSelectorView) + + // addFormRow(label: "Width", view: widthTextField) disabledSwitch @@ -64,19 +55,13 @@ class ButtonGroupViewController: BaseViewController { self?.buttonGroup.disabled = sender.isOn }.store(in: &subscribers) - textField - .textPublisher - .sink { [weak self] text in - self?.button.text = text - }.store(in: &subscribers) - - widthTextField - .textPublisher - .sink { [weak self] text in - if let n = NumberFormatter().number(from: text) { - self?.button.width = CGFloat(truncating: n) - } - }.store(in: &subscribers) +// widthTextField +// .textPublisher +// .sink { [weak self] text in +// if let n = NumberFormatter().number(from: text) { +// self?.buttonGroup.width = CGFloat(truncating: n) +// } +// }.store(in: &subscribers) } @@ -97,11 +82,9 @@ class ButtonGroupViewController: BaseViewController { //setup UI surfacePickerSelectorView.text = buttonGroup.surface.rawValue + buttonPositionSelectorView.text = buttonGroup.buttonPosition.rawValue disabledSwitch.isOn = buttonGroup.disabled - textField.text = button.text - usePickerSelectorView.text = button.use.rawValue widthTextField.text = "" - buttonSizePickerSelectorView.text = ButtonSize.large.rawValue } func setupPicker(){ @@ -111,13 +94,8 @@ class ButtonGroupViewController: BaseViewController { self?.contentTopView.backgroundColor = item.color } - usePickerSelectorView.onPickerDidSelect = { [weak self] item in - self?.button.use = item - self?.button.backgroundColor = item.color - } - - buttonSizePickerSelectorView.onPickerDidSelect = { [weak self] item in - self?.button.size = item + buttonPositionSelectorView.onPickerDidSelect = { [weak self] item in + self?.buttonGroup.buttonPosition = item } } } From 162f58f7d4a73cd1ecd182284388dab931af1234 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 18 Nov 2022 11:06:25 -0600 Subject: [PATCH 5/5] updated anchors Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/ButtonViewController.swift | 9 ++++++--- .../ViewControllers/TextLinkCaretViewController.swift | 7 ++++--- VDSSample/ViewControllers/TextLinkViewController.swift | 7 ++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/VDSSample/ViewControllers/ButtonViewController.swift b/VDSSample/ViewControllers/ButtonViewController.swift index 9f50e25..781fcbd 100644 --- a/VDSSample/ViewControllers/ButtonViewController.swift +++ b/VDSSample/ViewControllers/ButtonViewController.swift @@ -32,12 +32,15 @@ class ButtonViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() + let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button) - button.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - button.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - button.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + button.pinTop() + button.pinBottom() + button.pinLeading() + button.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor).isActive = true + addContentTopView(view: view) setupForm() diff --git a/VDSSample/ViewControllers/TextLinkCaretViewController.swift b/VDSSample/ViewControllers/TextLinkCaretViewController.swift index bfd862e..9c5e7c3 100644 --- a/VDSSample/ViewControllers/TextLinkCaretViewController.swift +++ b/VDSSample/ViewControllers/TextLinkCaretViewController.swift @@ -27,9 +27,10 @@ class TextLinkCaretViewController: BaseViewController { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(textLinkCaret) - textLinkCaret.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - textLinkCaret.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - textLinkCaret.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + textLinkCaret.pinTop() + textLinkCaret.pinBottom() + textLinkCaret.pinLeading() + textLinkCaret.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor).isActive = true addContentTopView(view: view) setupForm() diff --git a/VDSSample/ViewControllers/TextLinkViewController.swift b/VDSSample/ViewControllers/TextLinkViewController.swift index dc52048..e3274ef 100644 --- a/VDSSample/ViewControllers/TextLinkViewController.swift +++ b/VDSSample/ViewControllers/TextLinkViewController.swift @@ -27,9 +27,10 @@ class TextLinkViewController: BaseViewController { let view = UIView() view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(textLink) - textLink.topAnchor.constraint(equalTo: view.topAnchor).isActive = true - textLink.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true - textLink.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + textLink.pinTop() + textLink.pinBottom() + textLink.pinLeading() + textLink.trailingAnchor.constraint(lessThanOrEqualTo: view.trailingAnchor).isActive = true addContentTopView(view: view) setupForm()