diff options
| -rw-r--r-- | Sora/Views/InteractiveImageView.swift | 14 | ||||
| -rw-r--r-- | SoraTests/ViewDerivedDataTests.swift | 36 |
2 files changed, 50 insertions, 0 deletions
diff --git a/Sora/Views/InteractiveImageView.swift b/Sora/Views/InteractiveImageView.swift index 2bafa5d..11b4c62 100644 --- a/Sora/Views/InteractiveImageView.swift +++ b/Sora/Views/InteractiveImageView.swift @@ -33,6 +33,10 @@ struct InteractiveImageView<MenuItems: View>: View { .contextMenu { if !isZoomed { contextMenu } } .frame(maxWidth: .infinity, maxHeight: .infinity) .ifiOS26Unavailable { $0.clipped() } + .accessibilityElement(children: .ignore) + .accessibilityLabel(Text("Image")) + .accessibilityValue(Text(isZoomed ? "Zoomed in" : "Fit to screen")) + .accessibilityHint(Text("Double-tap to zoom. Pinch to adjust zoom level.")) #else Group { image @@ -97,6 +101,16 @@ struct InteractiveImageView<MenuItems: View>: View { } } ) + .accessibilityElement(children: .ignore) + .accessibilityLabel(Text("Image")) + .accessibilityValue( + Text( + currentScale > 1 + ? "Zoom \(Int((currentScale * 100).rounded())) percent" + : "Fit to screen" + ) + ) + .accessibilityHint(Text("Double-tap to zoom. Pinch to adjust zoom level.")) #endif } diff --git a/SoraTests/ViewDerivedDataTests.swift b/SoraTests/ViewDerivedDataTests.swift index 7ec8f9f..3a1d8df 100644 --- a/SoraTests/ViewDerivedDataTests.swift +++ b/SoraTests/ViewDerivedDataTests.swift @@ -325,6 +325,42 @@ final class ViewDerivedDataTests: XCTestCase { // swiftlint:disable:this type_b ) } + func testInteractiveImageViewProvidesExplicitAccessibilityMetadata() throws { + let source = try loadSource(at: "Sora/Views/InteractiveImageView.swift") + let normalizedSource = strippingCommentsAndStrings(from: source) + let accessibilityLabelCount = tokenCount( + matching: #"\.accessibilityLabel\s*\("#, + in: normalizedSource + ) + let accessibilityHintCount = tokenCount( + matching: #"\.accessibilityHint\s*\("#, + in: normalizedSource + ) + let accessibilityValueCount = tokenCount( + matching: #"\.accessibilityValue\s*\("#, + in: normalizedSource + ) + + // swiftlint:disable:next prefer_nimble + XCTAssertGreaterThan( + accessibilityLabelCount, + 0, + "Interactive image view should expose an explicit accessibility label." + ) + // swiftlint:disable:next prefer_nimble + XCTAssertGreaterThan( + accessibilityHintCount, + 0, + "Interactive image view should expose an explicit accessibility hint." + ) + // swiftlint:disable:next prefer_nimble + XCTAssertGreaterThan( + accessibilityValueCount, + 0, + "Interactive image view should expose stateful accessibility metadata." + ) + } + func testListViewsAvoidComparatorRandomShuffleSorting() throws { let listViewSource = try loadSource(at: "Sora/Views/Generic/GenericListView.swift") let favoritesViewSource = try loadSource(at: "Sora/Views/FavoritesView.swift") |