From c02f355847feb9a8170cbd1c44ef2e61d3829614 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 13 Jun 2024 13:22:30 -0500 Subject: [PATCH 1/6] updated icons Signed-off-by: Matt Bruce --- .../discover.imageset/Contents.json | 2 +- .../discover.imageset/Discover-02.svg | 1 + .../CreditCard/discover.imageset/discover.svg | 49 ------------------ .../CreditCard/jcb.imageset/Contents.json | 2 +- .../jcb.imageset/jcb-emblem-logo.svg | 1 + .../CreditCard/jcb.imageset/jcb.svg | 51 ------------------- 6 files changed, 4 insertions(+), 102 deletions(-) create mode 100644 VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg delete mode 100644 VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg create mode 100644 VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg delete mode 100644 VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json index 28cfbca3..d8a92d8d 100644 --- a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "discover.svg", + "filename" : "Discover-02.svg", "idiom" : "universal" } ], diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg new file mode 100644 index 00000000..ea75afb4 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/Discover-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg deleted file mode 100644 index a056ab58..00000000 --- a/VDS/SupportingFiles/Icons.xcassets/CreditCard/discover.imageset/discover.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json index 8a4c248a..c4aba6fe 100644 --- a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "jcb.svg", + "filename" : "jcb-emblem-logo.svg", "idiom" : "universal" } ], diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg new file mode 100644 index 00000000..4b8f6dd9 --- /dev/null +++ b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb-emblem-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg b/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg deleted file mode 100644 index ab197f4b..00000000 --- a/VDS/SupportingFiles/Icons.xcassets/CreditCard/jcb.imageset/jcb.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 0f27e8298782030d98a89b57859073ea7203b201 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 14 Jun 2024 08:47:45 -0500 Subject: [PATCH 2/6] removed duplicate code from base class Signed-off-by: Matt Bruce --- VDS/Components/TextFields/TextArea/TextArea.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/VDS/Components/TextFields/TextArea/TextArea.swift b/VDS/Components/TextFields/TextArea/TextArea.swift index b0d858df..87f9a81d 100644 --- a/VDS/Components/TextFields/TextArea/TextArea.swift +++ b/VDS/Components/TextFields/TextArea/TextArea.swift @@ -137,7 +137,6 @@ open class TextArea: EntryFieldBase { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - fieldStackView.pinToSuperView(.uniform(VDSFormControls.spaceInset)) textView.isScrollEnabled = true textView.autocorrectionType = .no From 9871324c8e876619623af505dac12059fb977f20 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 14 Jun 2024 09:05:22 -0500 Subject: [PATCH 3/6] first cut of accessibility update Signed-off-by: Matt Bruce --- VDS/Components/DatePicker/DatePicker.swift | 38 ++++++++++++++----- .../DropdownSelect/DropdownSelect.swift | 14 +++---- .../TextFields/InputField/InputField.swift | 10 +++-- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/VDS/Components/DatePicker/DatePicker.swift b/VDS/Components/DatePicker/DatePicker.swift index 7645cce5..1bd987fd 100644 --- a/VDS/Components/DatePicker/DatePicker.swift +++ b/VDS/Components/DatePicker/DatePicker.swift @@ -100,16 +100,14 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - - fieldStackView.isAccessibilityElement = true - fieldStackView.accessibilityLabel = "Date Picker" - fieldStackView.accessibilityHint = "Double Tap to open" + + containerView.isAccessibilityElement = true // setting color config selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable() // tap gesture - fieldStackView + containerView .publisher(for: UITapGestureRecognizer()) .sink { [weak self] _ in guard let self else { return } @@ -147,9 +145,31 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov open override func updateAccessibility() { super.updateAccessibility() - fieldStackView.accessibilityLabel = "Date Picker, \(accessibilityLabelText)" - fieldStackView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." - fieldStackView.accessibilityValue = value + containerView.accessibilityLabel = "Date Picker, \(accessibilityLabelText)" + containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." + containerView.accessibilityValue = value + } + + open override var accessibilityElements: [Any]? { + get { + var elements = [Any]() + elements.append(contentsOf: [titleLabel, containerView]) + + if showError { + elements.append(statusIcon) + if let errorText, !errorText.isEmpty { + elements.append(errorLabel) + } + } + + if let helperText, !helperText.isEmpty { + elements.append(helperLabel) + } + + return elements + } + + set { super.accessibilityElements = newValue } } /// Resets to default settings. @@ -184,7 +204,7 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov controller.dismiss(animated: true) { [weak self] in guard let self else { return } self.sendActions(for: .valueChanged) - UIAccessibility.post(notification: .layoutChanged, argument: self.fieldStackView) + UIAccessibility.post(notification: .layoutChanged, argument: self.containerView) } } diff --git a/VDS/Components/DropdownSelect/DropdownSelect.swift b/VDS/Components/DropdownSelect/DropdownSelect.swift index ae07d616..e825e024 100644 --- a/VDS/Components/DropdownSelect/DropdownSelect.swift +++ b/VDS/Components/DropdownSelect/DropdownSelect.swift @@ -131,7 +131,7 @@ open class DropdownSelect: EntryFieldBase { open override func setup() { super.setup() - fieldStackView.isAccessibilityElement = true + containerView.isAccessibilityElement = true inlineDisplayLabel.isAccessibilityElement = true dropdownField.width(0) @@ -278,15 +278,15 @@ open class DropdownSelect: EntryFieldBase { open override func updateAccessibility() { super.updateAccessibility() - fieldStackView.accessibilityLabel = "Dropdown Select, \(accessibilityLabelText)" - fieldStackView.accessibilityHint = isReadOnly || !isEnabled ? "" : "has popup, Double tap to open." - fieldStackView.accessibilityValue = value + containerView.accessibilityLabel = "Dropdown Select, \(accessibilityLabelText)" + containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "has popup, Double tap to open." + containerView.accessibilityValue = value } open override var accessibilityElements: [Any]? { get { var elements = [Any]() - elements.append(contentsOf: [titleLabel, fieldStackView]) + elements.append(contentsOf: [titleLabel, containerView]) if showError { elements.append(statusIcon) @@ -310,7 +310,7 @@ open class DropdownSelect: EntryFieldBase { optionsPicker.isHidden = true dropdownField.resignFirstResponder() setNeedsUpdate() - UIAccessibility.post(notification: .layoutChanged, argument: fieldStackView) + UIAccessibility.post(notification: .layoutChanged, argument: containerView) } open override var canBecomeFirstResponder: Bool { @@ -337,8 +337,8 @@ extension DropdownSelect: UIPickerViewDelegate, UIPickerViewDataSource { internal func launchPicker() { if optionsPicker.isHidden { - UIAccessibility.post(notification: .layoutChanged, argument: optionsPicker) dropdownField.becomeFirstResponder() + UIAccessibility.post(notification: .layoutChanged, argument: optionsPicker) } else { dropdownField.resignFirstResponder() } diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index a160420a..54286fa9 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -181,6 +181,9 @@ open class InputField: EntryFieldBase { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() + containerView.isAccessibilityElement = true + textField.isAccessibilityElement = false + textField.heightAnchor.constraint(equalToConstant: 20).isActive = true textField.delegate = self bottomContainerStackView.insertArrangedSubview(successLabel, at: 0) @@ -230,8 +233,9 @@ open class InputField: EntryFieldBase { open override func updateAccessibility() { super.updateAccessibility() - textField.accessibilityLabel = accessibilityLabelText - textField.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." + containerView.accessibilityLabel = "Input Field, \(accessibilityLabelText)" + containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to edit." + containerView.accessibilityValue = value } open override func updateErrorLabel() { @@ -264,7 +268,7 @@ open class InputField: EntryFieldBase { open override var accessibilityElements: [Any]? { get { var elements = [Any]() - elements.append(contentsOf: [titleLabel, textField]) + elements.append(contentsOf: [titleLabel, containerView]) if showError { elements.append(statusIcon) if let errorText, !errorText.isEmpty { From c1f2aa65919d28b1cf7c046ea86828432173040b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 14 Jun 2024 11:33:59 -0500 Subject: [PATCH 4/6] refactored textarea Signed-off-by: Matt Bruce --- VDS/Components/TextFields/TextArea/TextArea.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/VDS/Components/TextFields/TextArea/TextArea.swift b/VDS/Components/TextFields/TextArea/TextArea.swift index 90e797a4..79e7b825 100644 --- a/VDS/Components/TextFields/TextArea/TextArea.swift +++ b/VDS/Components/TextFields/TextArea/TextArea.swift @@ -137,7 +137,8 @@ open class TextArea: EntryFieldBase { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - + containerView.isAccessibilityElement = true + textView.isAccessibilityElement = false textView.isScrollEnabled = true textView.autocorrectionType = .no @@ -194,8 +195,9 @@ open class TextArea: EntryFieldBase { open override func updateAccessibility() { super.updateAccessibility() - textView.accessibilityLabel = accessibilityLabelText - textView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." + containerView.accessibilityLabel = "\(Self.self), \(accessibilityLabelText)" + containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." + containerView.accessibilityValue = value } override func updateRules() { @@ -225,7 +227,7 @@ open class TextArea: EntryFieldBase { open override var accessibilityElements: [Any]? { get { var elements = [Any]() - elements.append(contentsOf: [titleLabel, textView]) + elements.append(contentsOf: [titleLabel, containerView]) if showError { elements.append(statusIcon) From 652088bbb186e44da1c8f180f6c662339ef5fbdc Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 14 Jun 2024 12:31:21 -0500 Subject: [PATCH 5/6] refactored to base class and removed more duplicate code Signed-off-by: Matt Bruce --- VDS/Components/DatePicker/DatePicker.swift | 33 +----------- .../DropdownSelect/DropdownSelect.swift | 31 ------------ .../TextFields/EntryFieldBase.swift | 38 +++++++++++++- .../TextFields/InputField/InputField.swift | 13 ++--- .../TextFields/TextArea/TextArea.swift | 50 ++++--------------- 5 files changed, 51 insertions(+), 114 deletions(-) diff --git a/VDS/Components/DatePicker/DatePicker.swift b/VDS/Components/DatePicker/DatePicker.swift index 1040a82c..fdc6e05f 100644 --- a/VDS/Components/DatePicker/DatePicker.swift +++ b/VDS/Components/DatePicker/DatePicker.swift @@ -100,8 +100,6 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - - containerView.isAccessibilityElement = true // setting color config selectedDateLabel.textColorConfiguration = primaryColorConfiguration.eraseToAnyColorable() @@ -142,36 +140,7 @@ open class DatePicker: EntryFieldBase, DatePickerViewControllerDelegate, UIPopov selectedDateLabel.isEnabled = isEnabled calendarIcon.color = iconColorConfiguration.getColor(self) } - - open override func updateAccessibility() { - super.updateAccessibility() - containerView.accessibilityLabel = "Date Picker, \(accessibilityLabelText)" - containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." - containerView.accessibilityValue = value - } - - open override var accessibilityElements: [Any]? { - get { - var elements = [Any]() - elements.append(contentsOf: [titleLabel, containerView]) - - if showError { - elements.append(statusIcon) - if let errorText, !errorText.isEmpty { - elements.append(errorLabel) - } - } - - if let helperText, !helperText.isEmpty { - elements.append(helperLabel) - } - - return elements - } - - set { super.accessibilityElements = newValue } - } - + /// Resets to default settings. open override func reset() { super.reset() diff --git a/VDS/Components/DropdownSelect/DropdownSelect.swift b/VDS/Components/DropdownSelect/DropdownSelect.swift index 37ec7984..4b9026f1 100644 --- a/VDS/Components/DropdownSelect/DropdownSelect.swift +++ b/VDS/Components/DropdownSelect/DropdownSelect.swift @@ -131,7 +131,6 @@ open class DropdownSelect: EntryFieldBase { open override func setup() { super.setup() - containerView.isAccessibilityElement = true inlineDisplayLabel.isAccessibilityElement = true dropdownField.width(0) @@ -276,36 +275,6 @@ open class DropdownSelect: EntryFieldBase { statusIcon.color = iconColorConfiguration.getColor(self) } - open override func updateAccessibility() { - super.updateAccessibility() - containerView.accessibilityLabel = "Dropdown Select, \(accessibilityLabelText)" - containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "has popup, Double tap to open." - containerView.accessibilityValue = value - } - - open override var accessibilityElements: [Any]? { - get { - var elements = [Any]() - elements.append(contentsOf: [titleLabel, containerView]) - - if showError { - elements.append(statusIcon) - if let errorText, !errorText.isEmpty { - elements.append(errorLabel) - } - } - - if let helperText, !helperText.isEmpty { - elements.append(helperLabel) - } - - return elements - } - - set { super.accessibilityElements = newValue } - } - - @objc open func pickerDoneClicked() { optionsPicker.isHidden = true dropdownField.resignFirstResponder() diff --git a/VDS/Components/TextFields/EntryFieldBase.swift b/VDS/Components/TextFields/EntryFieldBase.swift index 2111a7f0..493aff0f 100644 --- a/VDS/Components/TextFields/EntryFieldBase.swift +++ b/VDS/Components/TextFields/EntryFieldBase.swift @@ -95,6 +95,7 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { internal var containerView: UIView = { return UIView().with { $0.translatesAutoresizingMaskIntoConstraints = false + $0.isAccessibilityElement = true } }() @@ -243,7 +244,8 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { open var accessibilityLabelText: String { var accessibilityLabels = [String]() - if let text = titleLabel.text { + + if let text = titleLabel.text?.trimmingCharacters(in: .whitespaces) { accessibilityLabels.append(text) } if isReadOnly { @@ -255,9 +257,14 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { if let errorText, showError { accessibilityLabels.append("error, \(errorText)") } + + accessibilityLabels.append("\(Self.self)") + return accessibilityLabels.joined(separator: ", ") } + open var accessibilityHintText: String = "Double tap to open" + //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- @@ -447,6 +454,35 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { } } + open override func updateAccessibility() { + super.updateAccessibility() + containerView.accessibilityLabel = accessibilityLabelText + containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : accessibilityHintText + containerView.accessibilityValue = value + } + + open override var accessibilityElements: [Any]? { + get { + var elements = [Any]() + elements.append(contentsOf: [titleLabel, containerView]) + + if showError { + elements.append(statusIcon) + if let errorText, !errorText.isEmpty { + elements.append(errorLabel) + } + } + + if let helperText, !helperText.isEmpty { + elements.append(helperLabel) + } + + return elements + } + + set { super.accessibilityElements = newValue } + } + //-------------------------------------------------- // MARK: - Private Methods //-------------------------------------------------- diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index 9635cb5f..e3336b76 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -102,6 +102,7 @@ open class InputField: EntryFieldBase { open var textField = TextField().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.textStyle = TextStyle.bodyLarge + $0.isAccessibilityElement = false } /// Color configuration for the textField. @@ -181,8 +182,7 @@ open class InputField: EntryFieldBase { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - containerView.isAccessibilityElement = true - textField.isAccessibilityElement = false + accessibilityHintText = "Double tap to edit" textField.heightAnchor.constraint(equalToConstant: 20).isActive = true textField.delegate = self @@ -230,14 +230,7 @@ open class InputField: EntryFieldBase { textField.isEnabled = isEnabled textField.isUserInteractionEnabled = isEnabled && !isReadOnly } - - open override func updateAccessibility() { - super.updateAccessibility() - containerView.accessibilityLabel = "Input Field, \(accessibilityLabelText)" - containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to edit." - containerView.accessibilityValue = value - } - + open override func updateErrorLabel() { super.updateErrorLabel() diff --git a/VDS/Components/TextFields/TextArea/TextArea.swift b/VDS/Components/TextFields/TextArea/TextArea.swift index 79e7b825..12fbc228 100644 --- a/VDS/Components/TextFields/TextArea/TextArea.swift +++ b/VDS/Components/TextFields/TextArea/TextArea.swift @@ -42,14 +42,14 @@ open class TextArea: EntryFieldBase { $0.spacing = VDSLayout.space3X } }() - + open var characterCounterLabel = Label().with { $0.setContentCompressionResistancePriority(.required, for: .vertical) $0.textStyle = .bodySmall $0.textAlignment = .right $0.numberOfLines = 1 } - + open var minHeight: Height = .twoX { didSet { setNeedsUpdate() } } //-------------------------------------------------- @@ -101,13 +101,15 @@ open class TextArea: EntryFieldBase { open override var value: String? { return textView.text } - + /// UITextView shown in the TextArea. open var textView = TextView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.sizeToFit() - $0.isScrollEnabled = false + $0.isAccessibilityElement = false + $0.isScrollEnabled = true $0.textContainerInset = .zero + $0.autocorrectionType = .no $0.textContainer.lineFragmentPadding = 0 } @@ -137,10 +139,8 @@ open class TextArea: EntryFieldBase { /// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations. open override func setup() { super.setup() - containerView.isAccessibilityElement = true - textView.isAccessibilityElement = false - textView.isScrollEnabled = true - textView.autocorrectionType = .no + + accessibilityHintText = "Double tap to edit" //events textView @@ -192,14 +192,7 @@ open class TextArea: EntryFieldBase { characterCounterLabel.surface = surface highlightCharacterOverflow() } - - open override func updateAccessibility() { - super.updateAccessibility() - containerView.accessibilityLabel = "\(Self.self), \(accessibilityLabelText)" - containerView.accessibilityHint = isReadOnly || !isEnabled ? "" : "Double tap to open." - containerView.accessibilityValue = value - } - + override func updateRules() { super.updateRules() @@ -223,30 +216,7 @@ open class TextArea: EntryFieldBase { stackView.addArrangedSubview(characterCounterLabel) return stackView } - - open override var accessibilityElements: [Any]? { - get { - var elements = [Any]() - elements.append(contentsOf: [titleLabel, containerView]) - - if showError { - elements.append(statusIcon) - if let errorText, !errorText.isEmpty { - elements.append(errorLabel) - } - } - - if let helperText, !helperText.isEmpty { - elements.append(helperLabel) - } - - return elements - } - - set { super.accessibilityElements = newValue } - } - - + open override var canBecomeFirstResponder: Bool { return textView.canBecomeFirstResponder } From e8f225cdc310d78a094f347fedbcb37988393180 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 14 Jun 2024 12:59:13 -0500 Subject: [PATCH 6/6] refactored responder property Signed-off-by: Matt Bruce --- .../DropdownSelect/DropdownSelect.swift | 18 ++-------------- .../TextFields/EntryFieldBase.swift | 18 ++++++++++++++++ .../TextFields/InputField/InputField.swift | 21 ++++--------------- .../TextFields/TextArea/TextArea.swift | 19 +++-------------- 4 files changed, 27 insertions(+), 49 deletions(-) diff --git a/VDS/Components/DropdownSelect/DropdownSelect.swift b/VDS/Components/DropdownSelect/DropdownSelect.swift index 4b9026f1..1496f392 100644 --- a/VDS/Components/DropdownSelect/DropdownSelect.swift +++ b/VDS/Components/DropdownSelect/DropdownSelect.swift @@ -66,6 +66,8 @@ open class DropdownSelect: EntryFieldBase { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- + internal override var responder: UIResponder? { dropdownField } + internal var minWidthDefault = 66.0 internal var minWidthInlineLabel = 102.0 internal override var minWidth: CGFloat { showInlineLabel ? minWidthInlineLabel : minWidthDefault } @@ -281,22 +283,6 @@ open class DropdownSelect: EntryFieldBase { setNeedsUpdate() UIAccessibility.post(notification: .layoutChanged, argument: containerView) } - - open override var canBecomeFirstResponder: Bool { - return dropdownField.canBecomeFirstResponder - } - - open override func becomeFirstResponder() -> Bool { - return dropdownField.becomeFirstResponder() - } - - open override var canResignFirstResponder: Bool { - return dropdownField.canResignFirstResponder - } - - open override func resignFirstResponder() -> Bool { - return dropdownField.resignFirstResponder() - } } //-------------------------------------------------- diff --git a/VDS/Components/TextFields/EntryFieldBase.swift b/VDS/Components/TextFields/EntryFieldBase.swift index 493aff0f..4e7422ee 100644 --- a/VDS/Components/TextFields/EntryFieldBase.swift +++ b/VDS/Components/TextFields/EntryFieldBase.swift @@ -40,6 +40,8 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- + internal var responder: UIResponder? { return nil } + internal let mainStackView = UIStackView().with { $0.axis = .vertical $0.alignment = .fill @@ -367,6 +369,22 @@ open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { isReadOnly = false onChange = nil } + + open override var canBecomeFirstResponder: Bool { + responder?.canBecomeFirstResponder ?? super.canBecomeFirstResponder + } + + open override func becomeFirstResponder() -> Bool { + responder?.becomeFirstResponder() ?? super.becomeFirstResponder() + } + + open override var canResignFirstResponder: Bool { + responder?.canResignFirstResponder ?? super.canResignFirstResponder + } + + open override func resignFirstResponder() -> Bool { + responder?.resignFirstResponder() ?? super.resignFirstResponder() + } //-------------------------------------------------- // MARK: - Public Methods diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index e3336b76..c2f779d4 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -34,6 +34,8 @@ open class InputField: EntryFieldBase { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- + internal override var responder: UIResponder? { textField } + internal override var containerBackgroundColor: UIColor { if showSuccess { return backgroundColorConfiguration.getColor(self) @@ -102,7 +104,7 @@ open class InputField: EntryFieldBase { open var textField = TextField().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.textStyle = TextStyle.bodyLarge - $0.isAccessibilityElement = false + $0.isAccessibilityElement = false } /// Color configuration for the textField. @@ -280,22 +282,6 @@ open class InputField: EntryFieldBase { set { super.accessibilityElements = newValue } } - - open override var canBecomeFirstResponder: Bool { - return textField.canBecomeFirstResponder - } - - open override func becomeFirstResponder() -> Bool { - return textField.becomeFirstResponder() - } - - open override var canResignFirstResponder: Bool { - return textField.canResignFirstResponder - } - - open override func resignFirstResponder() -> Bool { - return textField.resignFirstResponder() - } } extension InputField: UITextFieldDelegate { @@ -308,6 +294,7 @@ extension InputField: UITextFieldDelegate { public func textFieldDidEndEditing(_ textField: UITextField) { fieldType.handler().textFieldDidEndEditing(self, textField: textField) validate() + UIAccessibility.post(notification: .layoutChanged, argument: self.containerView) } public func textFieldDidChangeSelection(_ textField: UITextField) { diff --git a/VDS/Components/TextFields/TextArea/TextArea.swift b/VDS/Components/TextFields/TextArea/TextArea.swift index 12fbc228..a487dc53 100644 --- a/VDS/Components/TextFields/TextArea/TextArea.swift +++ b/VDS/Components/TextFields/TextArea/TextArea.swift @@ -32,6 +32,8 @@ open class TextArea: EntryFieldBase { //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- + internal override var responder: UIResponder? { textView } + internal var textViewHeightConstraint: NSLayoutConstraint? internal var inputFieldStackView: UIStackView = { @@ -159,6 +161,7 @@ open class TextArea: EntryFieldBase { .publisher(for: .editingDidEnd) .sink { [weak self] _ in self?.validate() + UIAccessibility.post(notification: .layoutChanged, argument: self?.containerView) }.store(in: &subscribers) textViewHeightConstraint = textView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height) @@ -217,22 +220,6 @@ open class TextArea: EntryFieldBase { return stackView } - open override var canBecomeFirstResponder: Bool { - return textView.canBecomeFirstResponder - } - - open override func becomeFirstResponder() -> Bool { - return textView.becomeFirstResponder() - } - - open override var canResignFirstResponder: Bool { - return textView.canResignFirstResponder - } - - open override func resignFirstResponder() -> Bool { - return textView.resignFirstResponder() - } - //-------------------------------------------------- // MARK: - Private Methods //--------------------------------------------------