diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 22f64a5..364be8a 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -571,7 +571,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = VDSSample/Info.plist; @@ -601,7 +601,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = VDSSample/Info.plist; diff --git a/VDSSample/Classes/TextField.swift b/VDSSample/Classes/TextField.swift index b1349f0..d6d64dd 100644 --- a/VDSSample/Classes/TextField.swift +++ b/VDSSample/Classes/TextField.swift @@ -7,6 +7,7 @@ import Foundation import UIKit +import VDS class TextField: UITextField { var textPadding = UIEdgeInsets( @@ -16,6 +17,15 @@ class TextField: UITextField { right: 10 ) + override init(frame: CGRect) { + super.init(frame: frame) + font = TypographicalStyle.BodyLarge.font + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func textRect(forBounds bounds: CGRect) -> CGRect { layer.borderColor = UIColor.black.cgColor layer.borderWidth = 1 diff --git a/VDSSample/Protocols/PickerBase.swift b/VDSSample/Protocols/PickerBase.swift index 448db0a..d81a81b 100644 --- a/VDSSample/Protocols/PickerBase.swift +++ b/VDSSample/Protocols/PickerBase.swift @@ -36,7 +36,10 @@ public class PickerSelectorView: UIStackView, Picker private weak var picker: UIPickerView? fileprivate var selectedIndex = 0 private var subscribers = Set() - private var label = UILabel() + private var label = Label().with { + $0.typograpicalStyle = .BodyLarge + } + private var button = Button().with { instance in instance.size = .small instance.use = .secondary @@ -88,11 +91,6 @@ public class PickerSelectorView: UIStackView, Picker items.count + 1 } - public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int ) -> String? { - guard row > 0, let item = items[row-1].rawValue as? String else { return "" } - return item - } - public func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { guard row - 1 >= 0 else { return } selectedIndex = row @@ -100,6 +98,21 @@ public class PickerSelectorView: UIStackView, Picker text = "\(items[row-1].rawValue)" pickerView.isHidden = true } + + public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { + var label = UILabel() + if let v = view as? UILabel { label = v } + label.font = TypographicalStyle.TitleMedium.font + label.text = title(for: row) + label.textAlignment = .center + return label + } + + private func title(for row: Int) -> String { + guard row > 0, let item = items[row-1].rawValue as? String else { return "" } + return item + } + } public class SurfacePickerSelectorView: PickerSelectorView{ diff --git a/VDSSample/Supporting Files/Resources/Base.lproj/Main.storyboard b/VDSSample/Supporting Files/Resources/Base.lproj/Main.storyboard index 556b010..38ca03c 100644 --- a/VDSSample/Supporting Files/Resources/Base.lproj/Main.storyboard +++ b/VDSSample/Supporting Files/Resources/Base.lproj/Main.storyboard @@ -1,8 +1,9 @@ - + - + + @@ -13,7 +14,7 @@ - + @@ -33,25 +34,6 @@ - - - - - - - - - - - - - diff --git a/VDSSample/ViewControllers/BadgeViewController.swift b/VDSSample/ViewControllers/BadgeViewController.swift index 4582ee9..db2e291 100644 --- a/VDSSample/ViewControllers/BadgeViewController.swift +++ b/VDSSample/ViewControllers/BadgeViewController.swift @@ -53,6 +53,8 @@ class BadgeViewController: BaseViewController { var maxWidthTextField = TextField() var badge = Badge() + override func allTextFields() -> [UITextField]? { [textField, maxWidthTextField] } + override func viewDidLoad() { super.viewDidLoad() @@ -68,7 +70,7 @@ class BadgeViewController: BaseViewController { addFormRow(label: "Text", view: textField) addFormRow(label: "Max Width", view: maxWidthTextField) addFormRow(label: "Number of Lines", view: numberOfLinesPickerSelectorView) - + textField .textPublisher .sink { [weak self] text in diff --git a/VDSSample/ViewControllers/BaseViewController.swift b/VDSSample/ViewControllers/BaseViewController.swift index ea04a4e..497ba8c 100644 --- a/VDSSample/ViewControllers/BaseViewController.swift +++ b/VDSSample/ViewControllers/BaseViewController.swift @@ -168,8 +168,9 @@ public class BaseViewController: UIViewController, Initable { $0.spacing = 5 } - let label = UILabel().with { + let label = Label().with { $0.text = label + $0.typograpicalStyle = .BodyLarge } formRow.addArrangedSubview(label) @@ -186,10 +187,23 @@ public class BaseViewController: UIViewController, Initable { } } - open func setup() {} + open func setup() { + if let textFields = allTextFields() { + for textField in textFields { + textField.returnKeyType = .done + textField + .publisher(for: .editingDidEndOnExit) + .sink { textField in + textField.resignFirstResponder() + } + .store(in: &subscribers) + } + } + } open func updateView() { print("\(Self.self) updateView()") } + open func allTextFields() -> [UITextField]? { nil } } diff --git a/VDSSample/ViewControllers/ButtonGroupViewController.swift b/VDSSample/ViewControllers/ButtonGroupViewController.swift index 141e49b..7697936 100644 --- a/VDSSample/ViewControllers/ButtonGroupViewController.swift +++ b/VDSSample/ViewControllers/ButtonGroupViewController.swift @@ -40,6 +40,8 @@ class ButtonGroupViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [widthTextField] } + func setupForm(){ addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) diff --git a/VDSSample/ViewControllers/ButtonViewController.swift b/VDSSample/ViewControllers/ButtonViewController.swift index 960beea..b1a92a1 100644 --- a/VDSSample/ViewControllers/ButtonViewController.swift +++ b/VDSSample/ViewControllers/ButtonViewController.swift @@ -40,6 +40,8 @@ class ButtonViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [textField, widthTextField] } + func setupForm(){ addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Use", view: usePickerSelectorView) diff --git a/VDSSample/ViewControllers/CheckBoxGroupViewController.swift b/VDSSample/ViewControllers/CheckBoxGroupViewController.swift index 21bcb0e..abe2586 100644 --- a/VDSSample/ViewControllers/CheckBoxGroupViewController.swift +++ b/VDSSample/ViewControllers/CheckBoxGroupViewController.swift @@ -29,6 +29,8 @@ class CheckboxGroupViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [labelTextField, childTextField] } + func setupForm() { addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Surface", view: surfacePickerSelectorView) diff --git a/VDSSample/ViewControllers/CheckboxViewController.swift b/VDSSample/ViewControllers/CheckboxViewController.swift index a2d9c78..f8f9d07 100644 --- a/VDSSample/ViewControllers/CheckboxViewController.swift +++ b/VDSSample/ViewControllers/CheckboxViewController.swift @@ -30,6 +30,8 @@ class CheckboxViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [labelTextField, childTextField, errorTextField] } + func setupForm(){ addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Surface", view: surfacePickerSelectorView) diff --git a/VDSSample/ViewControllers/LabelViewController.swift b/VDSSample/ViewControllers/LabelViewController.swift index 2036185..0f400b1 100644 --- a/VDSSample/ViewControllers/LabelViewController.swift +++ b/VDSSample/ViewControllers/LabelViewController.swift @@ -38,6 +38,8 @@ class LabelViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [textField] } + func setupForm(){ addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Bold", view: .makeWrapper(for: boldSwitch)) diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index 970cf08..51add23 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -7,9 +7,12 @@ import Foundation import UIKit +import VDS +import VDSColorTokens struct MenuComponent { var title: String + var completed: Bool var viewController: UIViewController.Type } @@ -17,26 +20,70 @@ protocol Initable { init() } +class MenuCell: UITableViewCell { + var completed: Bool = true { + didSet { + if completed { + statusImage.image = UIImage(systemName: "checkmark.circle") + statusImage.tintColor = VDSColor.paletteGreen26 + } else { + statusImage.image = UIImage(systemName: "xmark.circle") + statusImage.tintColor = VDSColor.paletteRed + } + } + } + + var statusImage = UIImageView().with { + $0.translatesAutoresizingMaskIntoConstraints = false + } + var label = Label().with { + $0.typograpicalStyle = .BodyLarge + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setup() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setup(){ + addSubview(statusImage) + addSubview(label) + statusImage.pinLeading(16) + label.pinLeading(statusImage.trailingAnchor, 10) + label.pinTop() + label.pinBottom() + label.pinTrailing() + statusImage.width(20) + statusImage.height(20) + statusImage.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + } +} + class MenuViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() overrideUserInterfaceStyle = .light + tableView.register(MenuCell.self, forCellReuseIdentifier: "cell") } 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), - MenuComponent(title: "RadioBoxGroup", viewController: RadioBoxGroupViewController.self), - MenuComponent(title: "RadioButtonGroup", viewController: RadioButtonViewController.self), - MenuComponent(title: "RadioSwatchGroup", viewController: RadioSwatchGroupViewController.self), - MenuComponent(title: "TextEntryField", viewController: TextEntryFieldViewController.self), - MenuComponent(title: "TextLink", viewController: TextLinkViewController.self), - MenuComponent(title: "TextLinkCaret", viewController: TextLinkCaretViewController.self), - MenuComponent(title: "Toggle", viewController: ToggleViewController.self) + MenuComponent(title: "Badge", completed: true, viewController: BadgeViewController.self), + MenuComponent(title: "Button", completed: true, viewController: ButtonViewController.self), + MenuComponent(title: "ButtonGroup", completed: false, viewController: ButtonGroupViewController.self), + MenuComponent(title: "Checkbox", completed: true, viewController: CheckboxViewController.self), + MenuComponent(title: "CheckboxGroup", completed: true, viewController: CheckboxGroupViewController.self), + MenuComponent(title: "Label", completed: true, viewController: LabelViewController.self), + MenuComponent(title: "RadioBoxGroup", completed: true, viewController: RadioBoxGroupViewController.self), + MenuComponent(title: "RadioButtonGroup", completed: true, viewController: RadioButtonViewController.self), + MenuComponent(title: "RadioSwatchGroup", completed: true, viewController: RadioSwatchGroupViewController.self), + MenuComponent(title: "TextEntryField", completed: false, viewController: TextEntryFieldViewController.self), + MenuComponent(title: "TextLink", completed: true, viewController: TextLinkViewController.self), + MenuComponent(title: "TextLinkCaret", completed: true, viewController: TextLinkCaretViewController.self), + MenuComponent(title: "Toggle", completed: true, viewController: ToggleViewController.self) ] override func numberOfSections(in tableView: UITableView) -> Int { @@ -47,14 +94,19 @@ class MenuViewController: UITableViewController { items.count } + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + 50.0 + } + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) + guard items.count > indexPath.row, + let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MenuCell + else { return UITableViewCell() } - guard items.count > indexPath.row else { return UITableViewCell() } let item = items[indexPath.row] - cell.textLabel?.text = item.title + cell.label.text = item.title + cell.completed = item.completed cell.accessoryType = .disclosureIndicator - return cell } diff --git a/VDSSample/ViewControllers/RadioBoxGroupViewController.swift b/VDSSample/ViewControllers/RadioBoxGroupViewController.swift index ac3f58c..7e0bcc6 100644 --- a/VDSSample/ViewControllers/RadioBoxGroupViewController.swift +++ b/VDSSample/ViewControllers/RadioBoxGroupViewController.swift @@ -31,6 +31,8 @@ class RadioBoxGroupViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [textField, subTextField, subTextRightField] } + func setupForm() { addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Surface", view: surfacePickerSelectorView) diff --git a/VDSSample/ViewControllers/RadioButtonViewController.swift b/VDSSample/ViewControllers/RadioButtonViewController.swift index 18afd8b..ea31fcf 100644 --- a/VDSSample/ViewControllers/RadioButtonViewController.swift +++ b/VDSSample/ViewControllers/RadioButtonViewController.swift @@ -29,6 +29,8 @@ class RadioButtonViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [labelTextField, childTextField] } + func setupForm() { addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Surface", view: surfacePickerSelectorView) diff --git a/VDSSample/ViewControllers/TextEntryFieldViewController.swift b/VDSSample/ViewControllers/TextEntryFieldViewController.swift index 4b01bfb..48ff990 100644 --- a/VDSSample/ViewControllers/TextEntryFieldViewController.swift +++ b/VDSSample/ViewControllers/TextEntryFieldViewController.swift @@ -41,6 +41,8 @@ class TextEntryFieldViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [labelTextField, errorTextField, successTextField, helperTextField, widthTextField, tooltipTitleTextField, tooltipContentTextField] } + func setupForm(){ addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Required", view: .makeWrapper(for: requiredSwitch)) diff --git a/VDSSample/ViewControllers/TextLinkCaretViewController.swift b/VDSSample/ViewControllers/TextLinkCaretViewController.swift index 5ea48c6..2067d72 100644 --- a/VDSSample/ViewControllers/TextLinkCaretViewController.swift +++ b/VDSSample/ViewControllers/TextLinkCaretViewController.swift @@ -33,6 +33,8 @@ class TextLinkCaretViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [textField] } + func setupForm(){ addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) diff --git a/VDSSample/ViewControllers/TextLinkViewController.swift b/VDSSample/ViewControllers/TextLinkViewController.swift index aab4b55..855f028 100644 --- a/VDSSample/ViewControllers/TextLinkViewController.swift +++ b/VDSSample/ViewControllers/TextLinkViewController.swift @@ -34,6 +34,8 @@ class TextLinkViewController: BaseViewController { setupModel() } + override func allTextFields() -> [UITextField]? { [textField] } + func setupForm(){ addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) diff --git a/VDSSample/ViewControllers/ToggleViewController.swift b/VDSSample/ViewControllers/ToggleViewController.swift index b9d4b75..aaa5b6e 100644 --- a/VDSSample/ViewControllers/ToggleViewController.swift +++ b/VDSSample/ViewControllers/ToggleViewController.swift @@ -52,6 +52,8 @@ class ToggleViewController: BaseViewController { setupPicker() } + override func allTextFields() -> [UITextField]? { [onTextField, offTextField] } + func setupForm() { addFormRow(label: "Show Text", view: .makeWrapper(for: showTextSwitch))