Skip to content

Commit a3a757c

Browse files
Revert "Fix AccessibilityContainer behaviour when it contains a UICollectionView" (#551)
This reverts commit 24b5aa0.
2 parents 03da9a5 + 7ea5d7b commit a3a757c

File tree

7 files changed

+17
-234
lines changed

7 files changed

+17
-234
lines changed

BlueprintUICommonControls/Sources/AccessibilityContainer.swift

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ public struct AccessibilityContainer: Element {
6262
config[\.accessibilityValue] = value
6363
config[\.accessibilityIdentifier] = identifier
6464
config[\.accessibilityContainerType] = containerType.UIKitContainerType
65-
config[\.layoutDirection] = context.environment.layoutDirection
6665
}
6766
}
6867
}
@@ -107,43 +106,25 @@ extension Element {
107106

108107
extension AccessibilityContainer {
109108
private final class AccessibilityContainerView: UIView {
110-
var layoutDirection: Environment.LayoutDirection = .leftToRight
111-
112109
override var accessibilityElements: [Any]? {
113-
get { accessibilityElements(layoutDirection: layoutDirection) }
110+
get { recursiveAccessibleSubviews() }
114111
set { fatalError("This property is not settable") }
115112
}
116113
}
117114
}
118115

119116
extension UIView {
120-
func accessibilityElements(layoutDirection: Environment.LayoutDirection) -> [NSObject] {
121-
recursiveAccessibilityElements().sorted(by: AccessibilityElement.frameSort(direction: layoutDirection))
122-
}
123-
124-
private func recursiveAccessibilityElements() -> [NSObject] {
125-
subviews.flatMap { subview -> [NSObject] in
117+
func recursiveAccessibleSubviews() -> [Any] {
118+
subviews.flatMap { subview -> [Any] in
126119
if subview.accessibilityElementsHidden || subview.isHidden {
127120
return []
128-
}
129-
130-
// UICollectionView is a special case because it uses virtualization to only show a subset of its elements.
131-
// By doing this, we outsource the logic of specifying the accessibility elements to the collection view itself.
132-
// If we did not do this, we would only make the visible cells accessible, and it would prevent the user from
133-
// scrolling/swiping to cells outside the visible area.
134-
if let collectionView = subview as? UICollectionView {
135-
return [collectionView]
136-
}
137-
138-
if let accessibilityElements = subview.accessibilityElements {
139-
return accessibilityElements.compactMap { $0 as? NSObject }
140-
}
141-
142-
if subview.isAccessibilityElement {
121+
} else if let accessibilityElements = subview.accessibilityElements {
122+
return accessibilityElements
123+
} else if subview.isAccessibilityElement {
143124
return [subview]
125+
} else {
126+
return subview.recursiveAccessibleSubviews()
144127
}
145-
146-
return subview.recursiveAccessibilityElements()
147128
}
148129
}
149130
}

BlueprintUICommonControls/Sources/AccessibilityElement.swift

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -202,29 +202,3 @@ extension Element {
202202
)
203203
}
204204
}
205-
206-
extension AccessibilityElement {
207-
public static func frameSort(direction: Environment.LayoutDirection) -> (NSObject, NSObject) -> Bool {
208-
{
209-
let first = $0.accessibilityFrame
210-
let second = $1.accessibilityFrame
211-
212-
// Derived through experimentation, this mimics the default sorting for UIKit.
213-
// If frames differ by more than 8 points the top most element is preferred.
214-
let verticalThreshold = 8.0
215-
let verticalDelta = abs(first.minY - second.minY)
216-
if verticalDelta > verticalThreshold {
217-
return first.minY < second.minY
218-
}
219-
220-
// Prefer the leading element.
221-
switch direction {
222-
case .leftToRight:
223-
return first.minX < second.minX
224-
225-
case .rightToLeft:
226-
return first.maxX > second.maxX
227-
}
228-
}
229-
}
230-
}

BlueprintUICommonControls/Tests/Sources/AccessibilityContainerTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AccessibilityContainerTests: XCTestCase {
1616
let outerContainerView = UIView()
1717
outerContainerView.addSubview(innerContainerView)
1818

19-
let accessibleSubviews = outerContainerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
19+
let accessibleSubviews = outerContainerView.recursiveAccessibleSubviews() as! [UIView]
2020

2121
XCTAssertEqual(accessibleSubviews.count, 2)
2222
XCTAssertTrue(accessibleSubviews.contains(where: { $0 === viewA }))
@@ -34,7 +34,7 @@ class AccessibilityContainerTests: XCTestCase {
3434
let containerView = UIView()
3535
containerView.addSubview(wrapperView)
3636

37-
let accessibleSubviews = containerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
37+
let accessibleSubviews = containerView.recursiveAccessibleSubviews() as! [UIView]
3838

3939
XCTAssertEqual(accessibleSubviews[0], accessibleView)
4040
}
@@ -53,7 +53,7 @@ class AccessibilityContainerTests: XCTestCase {
5353
outerContainerView.addSubview(accessibleView)
5454
outerContainerView.addSubview(innerContainerView)
5555

56-
let accessibleSubviews = outerContainerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
56+
let accessibleSubviews = outerContainerView.recursiveAccessibleSubviews() as! [UIView]
5757

5858
XCTAssertEqual(accessibleSubviews.count, 2)
5959
XCTAssertTrue(accessibleSubviews.contains(where: { $0 === viewA }))
@@ -81,7 +81,7 @@ class AccessibilityContainerTests: XCTestCase {
8181
outerContainerView.addSubview(accessibleView)
8282
outerContainerView.addSubview(innerContainerView)
8383

84-
let accessibleSubviews = outerContainerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
84+
let accessibleSubviews = outerContainerView.recursiveAccessibleSubviews() as! [UIView]
8585

8686
XCTAssertEqual(accessibleSubviews.count, 2)
8787
XCTAssertFalse(accessibleSubviews.contains(where: { $0 === undiscoveredViewA }))
@@ -100,7 +100,7 @@ class AccessibilityContainerTests: XCTestCase {
100100
let containerView = UIView()
101101
containerView.addSubview(wrapperView)
102102

103-
let accessibleSubviews = containerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
103+
let accessibleSubviews = containerView.recursiveAccessibleSubviews() as! [UIView]
104104

105105
XCTAssertNil(accessibleSubviews.first)
106106
}
@@ -117,7 +117,7 @@ class AccessibilityContainerTests: XCTestCase {
117117
let containerView = UIView()
118118
containerView.addSubview(wrapperView)
119119

120-
let accessibleSubviews = containerView.accessibilityElements(layoutDirection: .leftToRight) as! [UIView]
120+
let accessibleSubviews = containerView.recursiveAccessibleSubviews() as! [UIView]
121121

122122
XCTAssertNil(accessibleSubviews.first)
123123
}

BlueprintUICommonControls/UITests/AccessibilityContainerTests.swift

Lines changed: 0 additions & 136 deletions
This file was deleted.

BlueprintUICommonControls/UITests/UITestHost/AppDelegate.swift

Lines changed: 0 additions & 22 deletions
This file was deleted.

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
- Removed `AnimationAttributes.duration`.
2020

2121
### Changed
22+
- Reverted the change titled "Fixed `AccessibilityContainer` to better handle the accessibility ordering for a `UICollectionView` inside it (such as a `Listable` instance.)" pending further investigation.
2223

2324
### Deprecated
2425

SampleApp/Project.swift

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,9 @@ let project = Project(
2929
sources: ["Tutorials/Tutorial 2 (Completed)/**"]
3030
),
3131
.app(
32-
name: "BlueprintUI_TestHost",
32+
name: "UITestHost",
3333
sources: ["../BlueprintUI/UITests/UITestHost/**"]
3434
),
35-
.app(
36-
name: "BlueprintUICommonControls_TestHost",
37-
sources: ["../BlueprintUICommonControls/UITests/UITestHost/**"]
38-
),
3935

4036
// These tests are duplicates of the test definitions in the root Package.swift, but Tuist
4137
// does not currently support creating targets for tests in SwiftPM dependencies. See
@@ -52,17 +48,7 @@ let project = Project(
5248
bundleId: "$(inherited).UITests",
5349
deploymentTargets: .iOS("15.0"),
5450
sources: ["../BlueprintUI/Tests/Extensions/**", "../BlueprintUI/UITests/**"],
55-
dependencies: [.target(name: "BlueprintUI_TestHost")]
56-
),
57-
58-
.target(
59-
name: "BlueprintUICommonControls_UITests",
60-
destinations: .iOS,
61-
product: .uiTests,
62-
bundleId: "$(inherited).UITests",
63-
deploymentTargets: .iOS("15.0"),
64-
sources: ["../BlueprintUI/Tests/Extensions/**", "../BlueprintUICommonControls/UITests/**"],
65-
dependencies: [.target(name: "BlueprintUICommonControls_TestHost")]
51+
dependencies: [.target(name: "UITestHost")]
6652
),
6753

6854
.unitTest(
@@ -82,7 +68,6 @@ let project = Project(
8268
"BlueprintUI-Tests",
8369
"BlueprintUICommonControls-Tests",
8470
"BlueprintUI_UITests",
85-
"BlueprintUICommonControls_UITests",
8671
]
8772
)
8873
),

0 commit comments

Comments
 (0)