Skip to content

Commit 972a40a

Browse files
committed
Draft solution for iOS accessibilityLiveRegion
Read documentation, investigate different solutions, plan work (details) -- Test existing react-native accessibilityLiveRegion functionality on Android Paper (details)Include Video recording of different scenarios (assertive, polite, none)Write down expected behaviour for iOS Implementation Design (details) Detect accessibility content change (details) Read documentation, investigate different solutions, plan work ([details](#34735 (comment))) "Test existing react-native accessibilityLiveRegion functionality on Android Paper ([details](#34735 (comment))) Include Video recording of different scenarios (assertive, polite, none) Write down expected behaviour for iOS" Implementation Design ([details](#34735 (comment))) Detect accessibility content change ([details](#34735 (comment)))
1 parent 88d1825 commit 972a40a

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

Libraries/NativeComponent/BaseViewConfig.ios.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const validAttributesForNonEventProps = {
169169
accessible: true,
170170
accessibilityActions: true,
171171
accessibilityLabel: true,
172+
accessibilityLiveRegion: true,
172173
accessibilityHint: true,
173174
accessibilityLanguage: true,
174175
accessibilityValue: true,

React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,21 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &
292292

293293
// `accessibilityLabel`
294294
if (oldViewProps.accessibilityLabel != newViewProps.accessibilityLabel) {
295+
if ([self.nativeId isEqualToString:@"1"]) {
296+
if (@available(iOS 11.0, *)) {
297+
NSMutableDictionary<NSString *, NSNumber *> *attrsDictionary = [NSMutableDictionary new];
298+
// Step 3 - add parameter accessibilityLiveRegion. Copy/Paste android settings.
299+
// - retrieve parameter
300+
// - trigger check if parameter is polite or assertive
301+
NSLog(@"TESTING newViewProps.accessibilityLiveRegions is %d", newViewProps.accessibilityLiveRegion);
302+
attrsDictionary[UIAccessibilitySpeechAttributeQueueAnnouncement] = @(newViewProps.accessibilityLiveRegion == AccessibilityLiveRegion::Polite ? YES : NO);
303+
NSAttributedString *announcementWithAttrs = [[NSAttributedString alloc] initWithString:@"announcement"
304+
attributes:attrsDictionary];
305+
UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, announcementWithAttrs);
306+
}
307+
// Step 4 - instead of triggering the announcement, mark an instance variable to trigger announcement
308+
// - trigger only 1 time announcement once all props are set
309+
}
295310
self.accessibilityElement.accessibilityLabel = RCTNSStringFromStringNilIfEmpty(newViewProps.accessibilityLabel);
296311
}
297312

@@ -698,7 +713,6 @@ - (NSString *)accessibilityLabel
698713
if (label) {
699714
return label;
700715
}
701-
702716
return RCTRecursiveAccessibilityLabel(self);
703717
}
704718

React/Views/RCTViewManager.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ - (RCTShadowView *)shadowView
136136
RCT_REMAP_VIEW_PROPERTY(accessible, reactAccessibilityElement.isAccessibilityElement, BOOL)
137137
RCT_REMAP_VIEW_PROPERTY(accessibilityActions, reactAccessibilityElement.accessibilityActions, NSDictionaryArray)
138138
RCT_REMAP_VIEW_PROPERTY(accessibilityLabel, reactAccessibilityElement.accessibilityLabel, NSString)
139+
RCT_REMAP_VIEW_PROPERTY(accessibilityLiveRegion, reactAccessibilityElement.accessibilityLiveRegion, NSString)
139140
RCT_REMAP_VIEW_PROPERTY(accessibilityHint, reactAccessibilityElement.accessibilityHint, NSString)
140141
RCT_REMAP_VIEW_PROPERTY(accessibilityLanguage, reactAccessibilityElement.accessibilityLanguage, NSString)
141142
RCT_REMAP_VIEW_PROPERTY(accessibilityValue, reactAccessibilityElement.accessibilityValueInternal, NSDictionary)

0 commit comments

Comments
 (0)