Skip to content

Commit e329931

Browse files
committed
feat: Secure InputField accessibility support
1 parent adfea04 commit e329931

File tree

3 files changed

+45
-7
lines changed

3 files changed

+45
-7
lines changed

GoodSwiftUI-Sample/GoodSwiftUI-Sample/Screens/InputFieldSampleView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ extension InputFieldSampleView {
106106
private var nameInputField: some View {
107107
// Text field
108108
InputField(text: $name, title: "Name", placeholder: "Jožko", hint: "Text is limited to 10 characters")
109-
// Override of default accessibility
110-
.overrideAccessibilityLabel("Fill the name")
109+
// Override of default accessibility label
110+
.setAccessibilityLabel("Fill the name")
111111

112112
// "Continue" keyboard action button
113113
.inputFieldTraits(returnKeyType: .continue)
@@ -145,6 +145,9 @@ extension InputFieldSampleView {
145145
numpadReturnKeyTitle: "Done",
146146
isSecureTextEntry: true
147147
)
148+
149+
// Setting accessibility labels for eye Button (secureField)
150+
.setEyeButtonAccessibilityLabel(showLabel: "Show PIN", hideLabel: "Hide PIN")
148151

149152
// Custom validation criteria closure
150153
.validationCriteria {

Sources/GRInputField/SwiftUI/InputField.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public struct InputField<LeftView: View, RightView: View>: UIViewRepresentable {
4545
private var accessibilityLabel: String?
4646
private var accessibilityValue: String?
4747
private var accessibilityHint: String?
48+
private var showPasswordAccessibilityLabel: String?
49+
private var hidePasswordAccessibilityLabel: String?
4850

4951
// MARK: - Initialization
5052

@@ -371,6 +373,8 @@ public struct InputField<LeftView: View, RightView: View>: UIViewRepresentable {
371373
uiView.accessibilityLabel = accessibilityLabel
372374
uiView.accessibilityHint = accessibilityHint
373375
uiView.accessibilityValue = accessibilityValue
376+
uiView.showPasswordAccessibilityLabel = showPasswordAccessibilityLabel
377+
uiView.hidePasswordAccessibilityLabel = hidePasswordAccessibilityLabel
374378
}
375379

376380
}
@@ -457,24 +461,31 @@ public extension InputField {
457461

458462
public extension InputField {
459463

460-
func overrideAccessibilityLabel(_ label: String) -> Self {
464+
func setAccessibilityLabel(_ label: String) -> Self {
461465
var modifiedSelf = self
462466
modifiedSelf.accessibilityLabel = label
463467
return modifiedSelf
464468
}
465469

466-
func overrideAccessibilityHint(_ hint: String) -> Self {
470+
func setAccessibilityHint(_ hint: String) -> Self {
467471
var modifiedSelf = self
468472
modifiedSelf.accessibilityHint = hint
469473
return modifiedSelf
470474
}
471475

472-
func overrideAccessibilityValue(_ value: String) -> Self {
476+
func setAccessibilityValue(_ value: String) -> Self {
473477
var modifiedSelf = self
474478
modifiedSelf.accessibilityValue = value
475479
return modifiedSelf
476480
}
477481

482+
func setEyeButtonAccessibilityLabel(showLabel: String, hideLabel: String) -> Self {
483+
var modifiedSelf = self
484+
modifiedSelf.showPasswordAccessibilityLabel = showLabel
485+
modifiedSelf.hidePasswordAccessibilityLabel = hideLabel
486+
return modifiedSelf
487+
}
488+
478489
}
479490

480491
// MARK: - View focus extension

Sources/GRInputField/UIKit/InputFieldView.swift

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ public class InputFieldView: UIView {
109109
$0.translatesAutoresizingMaskIntoConstraints = false
110110
$0.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
111111
$0.setContentHuggingPriority(.defaultHigh, for: .horizontal)
112-
$0.isAccessibilityElement = false
113112
}
114113

115114
private let lineView = UIView().then {
@@ -135,6 +134,7 @@ public class InputFieldView: UIView {
135134
set {
136135
textField.text = newValue
137136
editingChangedSubject.send(newValue)
137+
accessibilityValue = newValue
138138
}
139139
}
140140

@@ -188,11 +188,32 @@ public class InputFieldView: UIView {
188188

189189
public override var accessibilityValue: String? {
190190
get {
191-
textField.accessibilityValue
191+
if isSecureTextEntry {
192+
return textField.isSecureTextEntry ? textField.accessibilityValue : text
193+
} else {
194+
return textField.accessibilityValue
195+
}
192196
} set {
197+
guard !isSecureTextEntry else { return }
198+
193199
textField.accessibilityValue = newValue
194200
}
195201
}
202+
203+
public var showPasswordAccessibilityLabel: String? {
204+
didSet {
205+
guard textField.isSecureTextEntry else { return }
206+
207+
eyeButton.accessibilityLabel = showPasswordAccessibilityLabel
208+
}
209+
}
210+
public var hidePasswordAccessibilityLabel: String? {
211+
didSet {
212+
guard !textField.isSecureTextEntry else { return }
213+
214+
eyeButton.accessibilityLabel = hidePasswordAccessibilityLabel
215+
}
216+
}
196217

197218
// MARK: - Initializer
198219

@@ -442,6 +463,9 @@ private extension InputFieldView {
442463
eyeButton.isHidden = false
443464
eyeButton.setImage(eyeImage, for: .normal)
444465
textField.isSecureTextEntry = isSecure
466+
eyeButton.accessibilityLabel = isSecure
467+
? showPasswordAccessibilityLabel
468+
: hidePasswordAccessibilityLabel
445469
}
446470

447471
func trimWhitespaceIfAllowed() {

0 commit comments

Comments
 (0)