Skip to content

Commit 4f75847

Browse files
committed
Add accessibilityElements to accessibilityContainer API [UI-6096]
1 parent 04822e7 commit 4f75847

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

BlueprintUICommonControls/Sources/AccessibilityContainer.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ public struct AccessibilityContainer: Element {
1818
/// An optional `accessibilityIdentifier` to give the container. Defaults to `nil`.
1919
public var identifier: String?
2020
public var wrapped: Element
21+
public var accessibilityElements: [Any]?
2122

2223
/// Creates a new `AccessibilityContainer` wrapping the provided element.
23-
public init(identifier: String? = nil, wrapping element: Element) {
24+
public init(identifier: String? = nil, accessibilityElements: [Any]? = nil, wrapping element: Element) {
2425
self.identifier = identifier
26+
self.accessibilityElements = accessibilityElements
2527
wrapped = element
2628
}
2729

@@ -36,6 +38,7 @@ public struct AccessibilityContainer: Element {
3638
public func backingViewDescription(with context: ViewDescriptionContext) -> ViewDescription? {
3739
AccessibilityContainerView.describe { config in
3840
config[\.accessibilityIdentifier] = identifier
41+
config[\.explicitAccessibilityElements] = self.accessibilityElements
3942
}
4043
}
4144
}
@@ -44,15 +47,17 @@ extension Element {
4447

4548
/// Acts as an accessibility container for any subviews
4649
/// where `isAccessibilityElement == true`.
47-
public func accessibilityContainer(identifier: String? = nil) -> Element {
48-
AccessibilityContainer(identifier: identifier, wrapping: self)
50+
public func accessibilityContainer(identifier: String? = nil, accessibilityElements: [Any]? = nil) -> Element {
51+
AccessibilityContainer(identifier: identifier, accessibilityElements: accessibilityElements, wrapping: self)
4952
}
5053
}
5154

5255
extension AccessibilityContainer {
5356
private final class AccessibilityContainerView: UIView {
57+
var explicitAccessibilityElements: [Any]?
58+
5459
override var accessibilityElements: [Any]? {
55-
get { recursiveAccessibleSubviews() }
60+
get { explicitAccessibilityElements ?? recursiveAccessibleSubviews() }
5661
set { fatalError("This property is not settable") }
5762
}
5863
}

BlueprintUICommonControls/Tests/Sources/AccessibilityContainerTests.swift

+35
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,39 @@ class AccessibilityContainerTests: XCTestCase {
121121

122122
XCTAssertNil(accessibleSubviews.first)
123123
}
124+
125+
func test_overrideAccessibility() {
126+
let label1 = Label(text: "One")
127+
let label2 = Label(text: "Two")
128+
let label3 = Label(text: "Three")
129+
let element = Column {
130+
label1
131+
label2
132+
label3
133+
}
134+
135+
let view = BlueprintView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
136+
137+
element
138+
.accessibilityContainer()
139+
.accessBackingView(in: view) { view in
140+
let textVals: [String] = view.accessibilityElements!.map {
141+
($0 as! UILabel).text!
142+
}
143+
144+
XCTAssertEqual(view.accessibilityElements?.count, 3)
145+
XCTAssertEqual(textVals, ["One", "Two", "Three"])
146+
}
147+
148+
element
149+
.accessibilityContainer(accessibilityElements: [label1, label3])
150+
.accessBackingView(in: view) { view in
151+
let textVals: [String] = view.accessibilityElements!.map {
152+
($0 as! BlueprintUICommonControls.Label).text
153+
}
154+
155+
XCTAssertEqual(view.accessibilityElements?.count, 2)
156+
XCTAssertEqual(textVals, ["One", "Three"])
157+
}
158+
}
124159
}

0 commit comments

Comments
 (0)