Skip to content

Commit 66e34db

Browse files
AccessibilityElement - User Input Labels (#538)
This PR adds support for configuring user input labels on `AccessibilityElement`.
1 parent a70cf54 commit 66e34db

File tree

3 files changed

+43
-25
lines changed

3 files changed

+43
-25
lines changed

BlueprintUICommonControls/Sources/AccessibilityElement.swift

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public struct AccessibilityElement: Element {
2626
/// An array containing one or more `CustomContent`s, defining additional content associated with the element. Assistive technologies, such as VoiceOver, will announce your custom content to the user at appropriate times.
2727
public var customContent: [CustomContent] = []
2828

29+
/// An array of localized labels the user provides to refer to the accessibility element.
30+
/// This is primarily used for Voice control, an element that contains descriptive information in its accessibilityLabel can return a more concise label. The primary label is first in the array, optionally followed by alternative labels in descending order of importance.
31+
public var userInputLabels: [String] = []
2932

3033
public init(
3134
label: String?,
@@ -37,6 +40,7 @@ public struct AccessibilityElement: Element {
3740
accessibilityFrameCornerStyle: CornerStyle = .square,
3841
customActions: [AccessibilityElement.CustomAction] = [],
3942
customContent: [AccessibilityElement.CustomContent] = [],
43+
userInputLabels: [String] = [],
4044
wrapping element: Element,
4145
configure: (inout Self) -> Void = { _ in }
4246
) {
@@ -49,6 +53,7 @@ public struct AccessibilityElement: Element {
4953
self.accessibilityFrameCornerStyle = accessibilityFrameCornerStyle
5054
self.customActions = customActions
5155
self.customContent = customContent
56+
self.userInputLabels = userInputLabels
5257
wrappedElement = element
5358
configure(&self)
5459
}
@@ -63,37 +68,39 @@ public struct AccessibilityElement: Element {
6368

6469
public func backingViewDescription(with context: ViewDescriptionContext) -> ViewDescription? {
6570
AccessibilityView.describe { config in
66-
config[\.accessibilityLabel] = label
67-
config[\.accessibilityValue] = value
68-
config[\.accessibilityHint] = hint
69-
config[\.accessibilityIdentifier] = identifier
70-
config[\.accessibilityTraits] = accessibilityTraits
71-
config[\.isAccessibilityElement] = true
72-
config[\.accessibilityFrameSize] = accessibilityFrameSize
73-
config[\.accessibilityFrameCornerStyle] = accessibilityFrameCornerStyle
74-
config[\.activate] = accessibilityActivate
75-
config[\.accessibilityCustomActions] = customActions.map { action in
76-
UIAccessibilityCustomAction(name: action.name, image: action.image) { _ in action.onActivation() }
77-
}
78-
config[\.accessibilityCustomContent] = customContent.map { $0.axCustomContent }
79-
80-
81-
if let adjustable = traits.first(where: { $0 == .adjustable({}, {}) }),
82-
case let .adjustable(incrementAction, decrementAction) = adjustable
83-
{
84-
config[\.increment] = incrementAction
85-
config[\.decrement] = decrementAction
86-
} else {
87-
config[\.increment] = nil
88-
config[\.decrement] = nil
71+
config.apply { element in
72+
element.accessibilityLabel = label
73+
element.accessibilityValue = value
74+
element.accessibilityHint = hint
75+
element.accessibilityIdentifier = identifier
76+
element.accessibilityTraits = accessibilityTraits
77+
element.isAccessibilityElement = true
78+
element.accessibilityFrameSize = accessibilityFrameSize
79+
element.accessibilityFrameCornerStyle = accessibilityFrameCornerStyle
80+
element.activate = accessibilityActivate
81+
element.accessibilityCustomActions = customActions.map { action in
82+
UIAccessibilityCustomAction(name: action.name, image: action.image) { _ in action.onActivation() }
83+
}
84+
element.accessibilityCustomContent = customContent.map { $0.axCustomContent }
85+
element.accessibilityUserInputLabels = userInputLabels
86+
87+
if let adjustable = traits.first(where: { $0 == .adjustable({}, {}) }),
88+
case let .adjustable(incrementAction, decrementAction) = adjustable
89+
{
90+
element.increment = incrementAction
91+
element.decrement = decrementAction
92+
} else {
93+
element.increment = nil
94+
element.decrement = nil
95+
}
8996
}
9097
}
9198
}
9299

93100
private final class AccessibilityView: UIView, AXCustomContentProvider {
94101
var accessibilityFrameSize: CGSize?
95102
var accessibilityFrameCornerStyle: CornerStyle = .square
96-
var accessibilityCustomContent: [AXCustomContent]! = [] // The exclamation `!` is in the protodol definition and required.
103+
var accessibilityCustomContent: [AXCustomContent]! = [] // The exclamation `!` is in the protocol definition and required.
97104

98105
var increment: (() -> Void)?
99106
var decrement: (() -> Void)?
@@ -177,7 +184,8 @@ extension Element {
177184
accessibilityFrameSize: CGSize? = nil,
178185
accessibilityFrameCornerStyle: CornerStyle = .square,
179186
customActions: [AccessibilityElement.CustomAction] = [],
180-
customContent: [AccessibilityElement.CustomContent] = []
187+
customContent: [AccessibilityElement.CustomContent] = [],
188+
userInputLabels: [String] = []
181189
) -> AccessibilityElement {
182190
AccessibilityElement(
183191
label: label,
@@ -189,6 +197,7 @@ extension Element {
189197
accessibilityFrameCornerStyle: accessibilityFrameCornerStyle,
190198
customActions: customActions,
191199
customContent: customContent,
200+
userInputLabels: userInputLabels,
192201
wrapping: self
193202
)
194203
}

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### Added
1515

1616
- `AccessibilityContainer` now supports configuration of `UIAccessibilityContainerType`, `AccessibilityLabel` and `AccessibilityValue`.
17+
- `AccessibilityElement` now supports configuration of `userInputLabels`.
1718

1819
### Removed
1920

SampleApp/Sources/AccessibilityViewController.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ final class AccessibilityViewController: UIViewController {
7171
}
7272
}.accessibilityElement(label: "Title", value: "Detail", traits: [])
7373

74+
Label(text: "This is an example of a long accessibility label")
75+
.accessibilityElement(
76+
label: "This is an example of a long accessibility label",
77+
value: "Detail",
78+
traits: [],
79+
userInputLabels: ["Short Input Label"]
80+
)
81+
7482
}
7583
.accessibilityContainer()
7684
.inset(uniform: 20)

0 commit comments

Comments
 (0)