From 51cd97861cd8ad90eee4e25c0bce243c1c963474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Tue, 26 Apr 2016 16:38:12 -0700 Subject: [PATCH] [ios] Announce zoom level, visible annotations after zooming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Announce the zoom level and number of visible annotations after zooming using VoiceOver’s swipe up or swipe down gesture. Works toward #4821. --- platform/ios/ios.xcodeproj/project.pbxproj | 14 ++++++++++ .../resources/Base.lproj/Localizable.strings | 3 +++ .../Base.lproj/Localizable.stringsdict | 27 +++++++++++++++++++ platform/ios/src/MGLMapView.mm | 17 ++++++++++-- 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 platform/ios/resources/Base.lproj/Localizable.stringsdict diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj index db90c43a4..f83183fb5 100644 --- a/platform/ios/ios.xcodeproj/project.pbxproj +++ b/platform/ios/ios.xcodeproj/project.pbxproj @@ -220,6 +220,8 @@ DABFB8711CBE9A0F00D62B32 /* MGLMapView+MGLCustomStyleLayerAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8848381CBAFB8500AB86E3 /* MGLMapView+MGLCustomStyleLayerAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; DABFB8721CBE9A0F00D62B32 /* MGLUserLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8848391CBAFB8500AB86E3 /* MGLUserLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; DABFB8731CBE9A9900D62B32 /* Mapbox.h in Headers */ = {isa = PBXBuildFile; fileRef = DA88485E1CBAFC2E00AB86E3 /* Mapbox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAC49C5C1CD02BC9009E1AA3 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DAC49C5F1CD02BC9009E1AA3 /* Localizable.stringsdict */; }; + DAC49C5D1CD02BC9009E1AA3 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DAC49C5F1CD02BC9009E1AA3 /* Localizable.stringsdict */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -459,6 +461,7 @@ DABCABBF1CB80717000A7C39 /* locations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = locations.cpp; sourceTree = ""; }; DABCABC01CB80717000A7C39 /* locations.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = locations.hpp; sourceTree = ""; }; DAC07C961CBB2CD6000CB309 /* mbgl.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = mbgl.xcconfig; path = ../../build/ios/mbgl.xcconfig; sourceTree = ""; }; + DAC49C5E1CD02BC9009E1AA3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = Base; path = Base.lproj/Localizable.stringsdict; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -720,6 +723,7 @@ isa = PBXGroup; children = ( DA89339F1CCC951200E68420 /* Localizable.strings */, + DAC49C5F1CD02BC9009E1AA3 /* Localizable.stringsdict */, DA8848771CBAFD5C00AB86E3 /* api_mapbox_com-digicert.der */, DA8848781CBAFD5C00AB86E3 /* api_mapbox_com-geotrust.der */, DA8848791CBAFD5C00AB86E3 /* star_tilestream_net.der */, @@ -1160,6 +1164,7 @@ DA8933F01CCD387900E68420 /* strip-frameworks.sh in Resources */, DA8848751CBAFCC100AB86E3 /* mapbox@3x.png in Resources */, DA88487B1CBAFD5C00AB86E3 /* api_mapbox_com-geotrust.der in Resources */, + DAC49C5C1CD02BC9009E1AA3 /* Localizable.stringsdict in Resources */, DA8933BF1CCD2CAD00E68420 /* Foundation.stringsdict in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1181,6 +1186,7 @@ DA8933DB1CCD31D400E68420 /* Foundation.strings in Resources */, DA8933DC1CCD31D400E68420 /* Foundation.stringsdict in Resources */, DA8933DD1CCD31D400E68420 /* api_mapbox_com-digicert.der in Resources */, + DAC49C5D1CD02BC9009E1AA3 /* Localizable.stringsdict in Resources */, DA8933DE1CCD31D400E68420 /* api_mapbox_com-geotrust.der in Resources */, DA8933DF1CCD31D400E68420 /* star_tilestream_net.der in Resources */, ); @@ -1390,6 +1396,14 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + DAC49C5F1CD02BC9009E1AA3 /* Localizable.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + DAC49C5E1CD02BC9009E1AA3 /* Base */, + ); + name = Localizable.stringsdict; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/platform/ios/resources/Base.lproj/Localizable.strings b/platform/ios/resources/Base.lproj/Localizable.strings index 35efb812d..c4569fe23 100644 --- a/platform/ios/resources/Base.lproj/Localizable.strings +++ b/platform/ios/resources/Base.lproj/Localizable.strings @@ -43,6 +43,9 @@ /* Accessibility label */ "MAP_A11Y_LABEL" = "Map"; +/* Map accessibility value */ +"MAP_A11Y_VALUE" = "Zoom %1$dx\n%2$ld annotation(s) visible"; + /* Action in attribution sheet */ "MAP_FEEDBACK" = "Improve This Map"; diff --git a/platform/ios/resources/Base.lproj/Localizable.stringsdict b/platform/ios/resources/Base.lproj/Localizable.stringsdict new file mode 100644 index 000000000..68204839f --- /dev/null +++ b/platform/ios/resources/Base.lproj/Localizable.stringsdict @@ -0,0 +1,27 @@ + + + + + MAP_A11Y_VALUE + + NSStringLocalizedFormatKey + %#@count@ + count + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + ld + zero + Zoom %dx +no annotations visible + one + Zoom %dx +%d annotation visible + other + Zoom %dx +%d annotations visible + + + + diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index a88cb9acd..954f0ea0f 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -1848,6 +1848,12 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration) #pragma mark - Accessibility - +- (NSString *)accessibilityValue +{ + double zoomLevel = round(self.zoomLevel - 1); + return [NSString stringWithFormat:NSLocalizedStringWithDefaultValue(@"MAP_A11Y_VALUE", nil, nil, @"Zoom %dx\n%ld annotation(s) visible", @"Map accessibility value"), (int)zoomLevel, (long)self.accessibilityAnnotationCount]; +} + - (CGRect)accessibilityFrame { CGRect frame = [super accessibilityFrame]; @@ -1881,8 +1887,7 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration) { return 2 /* selectedAnnotationCalloutView, mapViewProxyAccessibilityElement */; } - std::vector visibleAnnotations = [self annotationTagsInRect:self.bounds]; - NSInteger count = visibleAnnotations.size() + 2 /* compass, userLocationAnnotationView, attributionButton */; + NSInteger count = self.accessibilityAnnotationCount + 2 /* compass, attributionButton */; if (self.userLocationAnnotationView) { count++; @@ -1890,6 +1895,12 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration) return count; } +- (NSInteger)accessibilityAnnotationCount +{ + std::vector visibleAnnotations = [self annotationTagsInRect:self.bounds]; + return visibleAnnotations.size(); +} + - (id)accessibilityElementAtIndex:(NSInteger)index { if (self.calloutViewForSelectedAnnotation) @@ -2045,6 +2056,8 @@ mbgl::Duration MGLDurationInSeconds(NSTimeInterval duration) } _mbglMap->scaleBy(scaleFactor, mbgl::ScreenCoordinate { centerPoint.x, centerPoint.y }); [self unrotateIfNeededForGesture]; + + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.accessibilityValue); } #pragma mark - Geography -