summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Sora/Views/InteractiveImageView.swift14
-rw-r--r--SoraTests/ViewDerivedDataTests.swift36
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")