GitHub

@@ -101,6 +101,8 @@ - (UIView *)react_findClipView

101101

@implementation RCTView

102102

{

103103

UIColor *_backgroundColor;

104+

NSMutableDictionary<NSString *, NSDictionary *> *accessibilityActionsNameMap;

105+

NSMutableDictionary<NSString *, NSDictionary *> *accessibilityActionsLabelMap;

104106

}

105107106108

- (instancetype)initWithFrame:(CGRect)frame

@@ -156,33 +158,57 @@ - (NSString *)accessibilityLabel

156158

return RCTRecursiveAccessibilityLabel(self);

157159

}

158160161+

-(void)setAccessibilityActions:(NSArray *)actions

162+

{

163+

if (!actions) {

164+

return;

165+

}

166+

accessibilityActionsNameMap = [[NSMutableDictionary alloc] init];

167+

accessibilityActionsLabelMap = [[NSMutableDictionary alloc] init];

168+

for (NSDictionary *action in actions) {

169+

if (action[@"name"]) {

170+

accessibilityActionsNameMap[action[@"name"]] = action;

171+

}

172+

if (action[@"label"]) {

173+

accessibilityActionsLabelMap[action[@"label"]] = action;

174+

}

175+

}

176+

_accessibilityActions = [actions copy];

177+

}

178+159179

- (NSArray <UIAccessibilityCustomAction *> *)accessibilityCustomActions

160180

{

161181

if (!self.accessibilityActions.count) {

162182

return nil;

163183

}

164184165185

NSMutableArray *actions = [NSMutableArray array];

166-

for (NSString *action in self.accessibilityActions) {

167-

[actions addObject:[[UIAccessibilityCustomAction alloc] initWithName:action

168-

target:self

169-

selector:@selector(didActivateAccessibilityCustomAction:)]];

186+

for (NSDictionary *action in self.accessibilityActions) {

187+

if (action[@"label"]) {

188+

[actions addObject:[[UIAccessibilityCustomAction alloc] initWithName:action[@"label"]

189+

target:self

190+

selector:@selector(didActivateAccessibilityCustomAction:)]];

191+

}

170192

}

171193172194

return [actions copy];

173195

}

174196175197

- (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)action

176198

{

177-

if (!_onAccessibilityAction) {

199+

if (!_onAccessibilityAction || !accessibilityActionsLabelMap) {

178200

return NO;

179201

}

180202181-

_onAccessibilityAction(@{

182-

@"action": action.name,

183-

@"target": self.reactTag

184-

});

203+

// iOS defines the name as the localized label, so use our map to convert this back to the non-localized action namne when passing to JS. This allows for standard action names across platforms.

185204205+

NSDictionary *actionObject = accessibilityActionsLabelMap[action.name];

206+

if (actionObject) {

207+

_onAccessibilityAction(@{

208+

@"actionName": actionObject[@"name"],

209+

@"actionTarget": self.reactTag

210+

});

211+

}

186212

return YES;

187213

}

188214

@@ -327,9 +353,24 @@ - (BOOL)isAccessibilityElement

327353

return NO;

328354

}

329355356+

- (BOOL)performAccessibilityAction:(NSString *) name

357+

{

358+

if (_onAccessibilityAction && accessibilityActionsNameMap[name]) {

359+

_onAccessibilityAction(@{

360+

@"actionName" : name,

361+

@"actionTarget" : self.reactTag

362+

});

363+

return YES;

364+

}

365+

return NO;

366+

}

367+330368

- (BOOL)accessibilityActivate

331369

{

332-

if (_onAccessibilityTap) {

370+

if ([self performAccessibilityAction:@"activate"]) {

371+

return YES;

372+

}

373+

else if (_onAccessibilityTap) {

333374

_onAccessibilityTap(nil);

334375

return YES;

335376

} else {

@@ -339,7 +380,9 @@ - (BOOL)accessibilityActivate

339380340381

- (BOOL)accessibilityPerformMagicTap

341382

{

342-

if (_onMagicTap) {

383+

if ([self performAccessibilityAction:@"magicTap"]) {

384+

return YES;

385+

} else if (_onMagicTap) {

343386

_onMagicTap(nil);

344387

return YES;

345388

} else {

@@ -349,14 +392,26 @@ - (BOOL)accessibilityPerformMagicTap

349392350393

- (BOOL)accessibilityPerformEscape

351394

{

352-

if (_onAccessibilityEscape) {

395+

if ([self performAccessibilityAction:@"escape"]) {

396+

return YES;

397+

} else if (_onAccessibilityEscape) {

353398

_onAccessibilityEscape(nil);

354399

return YES;

355400

} else {

356401

return NO;

357402

}

358403

}

359404405+

- (void)accessibilityIncrement

406+

{

407+

[self performAccessibilityAction:@"increment"];

408+

}

409+410+

- (void)accessibilityDecrement

411+

{

412+

[self performAccessibilityAction:@"decrement"];

413+

}

414+360415

- (NSString *)description

361416

{

362417

NSString *superDescription = super.description;

Read the original on github.com ↗