1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#import "MGLMapAccessibilityElement.h"
#import "MGLDistanceFormatter.h"
#import "MGLFeature.h"
#import "MGLVectorSource+MGLAdditions.h"
#import "NSBundle+MGLAdditions.h"
@implementation MGLMapAccessibilityElement
- (instancetype)initWithAccessibilityContainer:(id)container {
if (self = [super initWithAccessibilityContainer:container]) {
self.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitAdjustable;
}
return self;
}
- (void)accessibilityIncrement {
[self.accessibilityContainer accessibilityIncrement];
}
- (void)accessibilityDecrement {
[self.accessibilityContainer accessibilityDecrement];
}
@end
@implementation MGLAnnotationAccessibilityElement
- (instancetype)initWithAccessibilityContainer:(id)container tag:(MGLAnnotationTag)tag {
if (self = [super initWithAccessibilityContainer:container]) {
_tag = tag;
self.accessibilityHint = NSLocalizedStringWithDefaultValue(@"ANNOTATION_A11Y_HINT", nil, nil, @"Shows more info", @"Accessibility hint");
}
return self;
}
@end
@implementation MGLFeatureAccessibilityElement
- (instancetype)initWithAccessibilityContainer:(id)container feature:(id<MGLFeature>)feature {
if (self = [super initWithAccessibilityContainer:container]) {
_feature = feature;
NSDictionary *attributes = feature.attributes;
NSString *nameAttribute = [NSString stringWithFormat:@"name_%@",
[MGLVectorSource preferredMapboxStreetsLanguage]];
self.accessibilityLabel = attributes[nameAttribute];
NSMutableArray *facts = [NSMutableArray array];
// Announce the kind of place or POI.
if (attributes[@"type"]) {
// FIXME: Unfortunately, these types aren’t a closed set that can be
// localized, since they’re based on OpenStreetMap tags.
NSString *type = [attributes[@"type"] stringByReplacingOccurrencesOfString:@"_"
withString:@" "];
[facts addObject:type];
}
// Announce the kind of airport, rail station, or mountain based on its
// Maki image name.
else if (attributes[@"maki"]) {
// TODO: Localize Maki image names.
[facts addObject:attributes[@"maki"]];
}
NSNumber *elevation = attributes[@"elevation_m"];
if (elevation) {
MGLDistanceFormatter *formatter = [[MGLDistanceFormatter alloc] init];
formatter.unitStyle = NSFormattingUnitStyleLong;
[facts addObject:[formatter stringFromDistance:elevation.doubleValue]];
}
if (facts.count) {
NSString *separator = NSLocalizedStringWithDefaultValue(@"LIST_SEPARATOR", nil, nil, @", ", @"List separator");
self.accessibilityValue = [facts componentsJoinedByString:separator];
}
}
return self;
}
@end
@implementation MGLMapViewProxyAccessibilityElement
- (instancetype)initWithAccessibilityContainer:(id)container {
if (self = [super initWithAccessibilityContainer:container]) {
self.accessibilityTraits = UIAccessibilityTraitButton;
self.accessibilityLabel = [self.accessibilityContainer accessibilityLabel];
self.accessibilityHint = NSLocalizedStringWithDefaultValue(@"CLOSE_CALLOUT_A11Y_HINT", nil, nil, @"Returns to the map", @"Accessibility hint for closing the selected annotation’s callout view and returning to the map");
}
return self;
}
@end
|