Accessibility Escape

Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/22047

Differential Revision: D13146179

Pulled By: cpojer

fbshipit-source-id: b8a089114a5deafee47dd482e484d413c8c39137
This commit is contained in:
Doug Russell 2018-12-06 19:39:42 -08:00 committed by Facebook Github Bot
parent 900f2df351
commit ee7c702308
9 changed files with 37 additions and 0 deletions

View File

@ -34,6 +34,7 @@ ReactNativeViewAttributes.UIView = {
onAccessibilityAction: true,
onAccessibilityTap: true,
onMagicTap: true,
onAccessibilityEscape: true,
collapsable: true,
needsOffscreenAlphaCompositing: true,
style: ReactNativeStyleAttributes,

View File

@ -62,6 +62,14 @@ type DirectEventProps = $ReadOnly<{|
* See http://facebook.github.io/react-native/docs/view.html#onmagictap
*/
onMagicTap?: ?() => void,
/**
* When `accessible` is `true`, the system will invoke this function when the
* user performs the escape gesture.
*
* See http://facebook.github.io/react-native/docs/view.html#onaccessibilityescape
*/
onAccessibilityEscape?: ?Function,
|}>;
type TouchEventProps = $ReadOnly<{|

View File

@ -30,6 +30,11 @@ class AccessibilityIOSExample extends React.Component<{}> {
accessible={true}>
<Text>Accessibility magic tap example</Text>
</View>
<View
onAccessibilityEscape={() => alert('onAccessibilityEscape success')}
accessible={true}>
<Text>Accessibility escape example</Text>
</View>
<View accessibilityLabel="Some announcement" accessible={true}>
<Text>Accessibility label example</Text>
</View>

View File

@ -553,6 +553,12 @@ static NSString *RCTRecursiveAccessibilityLabel(UIView *view)
return YES;
}
- (BOOL)accessibilityPerformEscape
{
_eventEmitter->onAccessibilityEscape();
return YES;
}
- (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)action
{
_eventEmitter->onAccessibilityAction(RCTStringFromNSString(action.name));

View File

@ -24,6 +24,7 @@
@property (nonatomic, copy) RCTDirectEventBlock onAccessibilityAction;
@property (nonatomic, copy) RCTDirectEventBlock onAccessibilityTap;
@property (nonatomic, copy) RCTDirectEventBlock onMagicTap;
@property (nonatomic, copy) RCTDirectEventBlock onAccessibilityEscape;
/**
* Accessibility properties

View File

@ -284,6 +284,16 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:unused)
}
}
- (BOOL)accessibilityPerformEscape
{
if (_onAccessibilityEscape) {
_onAccessibilityEscape(nil);
return YES;
} else {
return NO;
}
}
- (NSString *)description
{
NSString *superDescription = super.description;

View File

@ -119,6 +119,7 @@ RCT_REMAP_VIEW_PROPERTY(accessibilityIgnoresInvertColors, reactAccessibilityElem
RCT_REMAP_VIEW_PROPERTY(onAccessibilityAction, reactAccessibilityElement.onAccessibilityAction, RCTDirectEventBlock)
RCT_REMAP_VIEW_PROPERTY(onAccessibilityTap, reactAccessibilityElement.onAccessibilityTap, RCTDirectEventBlock)
RCT_REMAP_VIEW_PROPERTY(onMagicTap, reactAccessibilityElement.onMagicTap, RCTDirectEventBlock)
RCT_REMAP_VIEW_PROPERTY(onAccessibilityEscape, reactAccessibilityElement.onAccessibilityEscape, RCTDirectEventBlock)
RCT_REMAP_VIEW_PROPERTY(testID, reactAccessibilityElement.accessibilityIdentifier, NSString)
RCT_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor)

View File

@ -28,6 +28,10 @@ void ViewEventEmitter::onAccessibilityMagicTap() const {
dispatchEvent("magicTap");
}
void ViewEventEmitter::onAccessibilityEscape() const {
dispatchEvent("accessibilityEscape");
}
#pragma mark - Layout
void ViewEventEmitter::onLayout(const LayoutMetrics &layoutMetrics) const {

View File

@ -28,6 +28,7 @@ class ViewEventEmitter : public TouchEventEmitter {
void onAccessibilityAction(const std::string &name) const;
void onAccessibilityTap() const;
void onAccessibilityMagicTap() const;
void onAccessibilityEscape() const;
#pragma mark - Layout