mirror of
https://github.com/status-im/react-native.git
synced 2025-01-14 11:34:23 +00:00
Added accessibility traits support to View class
This commit is contained in:
parent
eedb880f6e
commit
6ef7eaf663
@ -24,6 +24,26 @@ var createReactNativeComponentClass = require('createReactNativeComponentClass')
|
||||
|
||||
var stylePropType = StyleSheetPropType(ViewStylePropTypes);
|
||||
|
||||
var AccessibilityTraits = [
|
||||
'none',
|
||||
'button',
|
||||
'link',
|
||||
'header',
|
||||
'search',
|
||||
'image',
|
||||
'selected',
|
||||
'plays',
|
||||
'key',
|
||||
'text',
|
||||
'summary',
|
||||
'disabled',
|
||||
'frequentUpdates',
|
||||
'startsMedia',
|
||||
'adjustable',
|
||||
'allowsDirectInteraction',
|
||||
'pageTurn',
|
||||
];
|
||||
|
||||
/**
|
||||
* The most fundamental component for building UI, `View` is a
|
||||
* container that supports layout with flexbox, style, some touch handling, and
|
||||
@ -70,6 +90,14 @@ var View = React.createClass({
|
||||
*/
|
||||
accessibilityLabel: PropTypes.string,
|
||||
|
||||
/**
|
||||
* Provides additional traits to screen reader. By default no traits are
|
||||
* provided unless specified otherwise in element
|
||||
*/
|
||||
accessibilityTraits: PropTypes.oneOfType([
|
||||
PropTypes.oneOf(AccessibilityTraits),
|
||||
PropTypes.arrayOf(PropTypes.oneOf(AccessibilityTraits)),
|
||||
]),
|
||||
/**
|
||||
* Used to locate this view in end-to-end tests.
|
||||
*/
|
||||
|
@ -19,6 +19,7 @@ ReactNativeViewAttributes.UIView = {
|
||||
pointerEvents: true,
|
||||
accessible: true,
|
||||
accessibilityLabel: true,
|
||||
accessibilityTraits: true,
|
||||
testID: true,
|
||||
onLayout: true,
|
||||
};
|
||||
|
@ -141,6 +141,7 @@ RCT_EXTERN BOOL RCTCopyProperty(id target, id source, NSString *keyPath);
|
||||
* Underlying implementations of RCT_XXX_CONVERTER macros. Ignore these.
|
||||
*/
|
||||
RCT_EXTERN NSNumber *RCTConvertEnumValue(const char *, NSDictionary *, NSNumber *, id);
|
||||
RCT_EXTERN NSNumber *RCTConvertMultiEnumValue(const char *, NSDictionary *, NSNumber *, id);
|
||||
RCT_EXTERN NSArray *RCTConvertArrayValue(SEL, id);
|
||||
RCT_EXTERN void RCTLogConvertError(id, const char *);
|
||||
|
||||
@ -194,6 +195,21 @@ RCT_CUSTOM_CONVERTER(type, type, [[self NSNumber:json] getter])
|
||||
return [RCTConvertEnumValue(#type, mapping, @(default), json) getter]; \
|
||||
}
|
||||
|
||||
/**
|
||||
* This macro is used for creating converters for enum types for
|
||||
* multiple enum values combined with | operator
|
||||
*/
|
||||
#define RCT_MULTI_ENUM_CONVERTER(type, values, default, getter) \
|
||||
+ (type)type:(id)json \
|
||||
{ \
|
||||
static NSDictionary *mapping; \
|
||||
static dispatch_once_t onceToken; \
|
||||
dispatch_once(&onceToken, ^{ \
|
||||
mapping = values; \
|
||||
}); \
|
||||
return [RCTConvertMultiEnumValue(#type, mapping, @(default), json) getter]; \
|
||||
}
|
||||
|
||||
/**
|
||||
* This macro is used for creating converter functions for typed arrays.
|
||||
*/
|
||||
|
@ -175,6 +175,22 @@ NSNumber *RCTConvertEnumValue(const char *typeName, NSDictionary *mapping, NSNum
|
||||
return value ?: defaultValue;
|
||||
}
|
||||
|
||||
NSNumber *RCTConvertMultiEnumValue(const char *typeName, NSDictionary *mapping, NSNumber *defaultValue, id json)
|
||||
{
|
||||
if ([json isKindOfClass:[NSArray class]]) {
|
||||
if ([json count] == 0) {
|
||||
return defaultValue;
|
||||
}
|
||||
long long result = 0;
|
||||
for (id arrayElement in json) {
|
||||
NSNumber *value = RCTConvertEnumValue(typeName, mapping, defaultValue, arrayElement);
|
||||
result |= [value longLongValue];
|
||||
}
|
||||
return @(result);
|
||||
}
|
||||
return RCTConvertEnumValue(typeName, mapping, defaultValue, json);
|
||||
}
|
||||
|
||||
RCT_ENUM_CONVERTER(NSTextAlignment, (@{
|
||||
@"auto": @(NSTextAlignmentNatural),
|
||||
@"left": @(NSTextAlignmentLeft),
|
||||
|
@ -18,6 +18,30 @@
|
||||
#import "RCTUtils.h"
|
||||
#import "RCTView.h"
|
||||
|
||||
@implementation RCTConvert(UIAccessibilityTraits)
|
||||
|
||||
RCT_MULTI_ENUM_CONVERTER(UIAccessibilityTraits, (@{
|
||||
@"none": @(UIAccessibilityTraitNone),
|
||||
@"button": @(UIAccessibilityTraitButton),
|
||||
@"link": @(UIAccessibilityTraitLink),
|
||||
@"header": @(UIAccessibilityTraitHeader),
|
||||
@"search": @(UIAccessibilityTraitSearchField),
|
||||
@"image": @(UIAccessibilityTraitImage),
|
||||
@"selected": @(UIAccessibilityTraitSelected),
|
||||
@"plays": @(UIAccessibilityTraitPlaysSound),
|
||||
@"key": @(UIAccessibilityTraitKeyboardKey),
|
||||
@"text": @(UIAccessibilityTraitStaticText),
|
||||
@"summary": @(UIAccessibilityTraitSummaryElement),
|
||||
@"disabled": @(UIAccessibilityTraitNotEnabled),
|
||||
@"frequentUpdates": @(UIAccessibilityTraitUpdatesFrequently),
|
||||
@"startsMedia": @(UIAccessibilityTraitStartsMediaSession),
|
||||
@"adjustable": @(UIAccessibilityTraitAdjustable),
|
||||
@"allowsDirectInteraction": @(UIAccessibilityTraitAllowsDirectInteraction),
|
||||
@"pageTurn": @(UIAccessibilityTraitCausesPageTurn),
|
||||
}), UIAccessibilityTraitNone, unsignedLongLongValue)
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTViewManager
|
||||
|
||||
@synthesize bridge = _bridge;
|
||||
@ -67,6 +91,7 @@ RCT_EXPORT_MODULE()
|
||||
#pragma mark - View properties
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(accessibilityLabel, NSString)
|
||||
RCT_EXPORT_VIEW_PROPERTY(accessibilityTraits, UIAccessibilityTraits)
|
||||
RCT_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor)
|
||||
RCT_REMAP_VIEW_PROPERTY(accessible, isAccessibilityElement, BOOL)
|
||||
RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString)
|
||||
|
Loading…
x
Reference in New Issue
Block a user