summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.jazzy.yaml2
-rw-r--r--platform/darwin/include/MGLDirectionFormatter.h77
-rw-r--r--platform/darwin/src/MGLDirectionFormatter.m167
-rw-r--r--platform/darwin/test/MGLDirectionFormatterTests.m111
-rw-r--r--platform/ios/CHANGELOG.md2
-rw-r--r--platform/ios/framework/Mapbox.h1
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj12
-rw-r--r--platform/osx/osx.xcodeproj/project.pbxproj12
-rw-r--r--platform/osx/sdk/Mapbox.h1
9 files changed, 384 insertions, 1 deletions
diff --git a/.jazzy.yaml b/.jazzy.yaml
index a6d47f25a2..e6ed144282 100644
--- a/.jazzy.yaml
+++ b/.jazzy.yaml
@@ -69,6 +69,8 @@ custom_categories:
- MGLCoordinateSpanMake
- MGLCoordinateSpanZero
- MGLDegreesFromRadians
+ - MGLDirectionFormatter
+ - MGLDirectionFormatterOrigin
- MGLRadiansFromDegrees
- MGLStringFromCoordinateBounds
- NSValue(MGLGeometryAdditions)
diff --git a/platform/darwin/include/MGLDirectionFormatter.h b/platform/darwin/include/MGLDirectionFormatter.h
new file mode 100644
index 0000000000..9091292e22
--- /dev/null
+++ b/platform/darwin/include/MGLDirectionFormatter.h
@@ -0,0 +1,77 @@
+#import <Foundation/Foundation.h>
+#import <CoreLocation/CoreLocation.h>
+
+#import "MGLTypes.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ The reference point for an `MGLDirectionFormatter`.
+ */
+typedef NS_ENUM(NSUInteger, MGLDirectionFormatterOrigin) {
+ /**
+ Directions are assumed to be relative to true north and are given as
+ compass directions, such as “south” for a value of `90`.
+ */
+ MGLDirectionFormatterOriginNorth = 0,
+ /**
+ Directions are assumed to be relative to the direction in which the user is
+ facing and are given as “clock directions”, such as “6 o’clock” for a value
+ of `90`.
+ */
+ MGLDirectionFormatterOriginStraightAhead,
+};
+
+/**
+ The `MGLDirectionFormatter` class provides properly formatted descriptions of
+ absolute or relative headings. Use this class to create localized heading
+ strings when displaying directional information to users.
+ */
+@interface MGLDirectionFormatter : NSFormatter
+
+/**
+ The receiver’s reference point. The receiver’s input is assumed to be relative
+ to this reference point, and its output is given in the conventional form for
+ directions with this reference point.
+
+ This class does not convert between different reference points. To convert an
+ `CLLocationDirection` with respect to true north into a `CLLocationDirection`
+ with respect to the direction in which the user is currently facing, use Core
+ Location to determine the user’s current heading.
+
+ The default value of this property is `MGLDirectionFormatterOriginNorth`, which
+ means a value of `0` is formatted as “north” in the receiver’s locale.
+ */
+@property (nonatomic) MGLDirectionFormatterOrigin origin;
+
+/**
+ The unit style used by this formatter.
+
+ This property defaults to `NSFormattingUnitStyleMedium`.
+ */
+@property (nonatomic) NSFormattingUnitStyle unitStyle;
+
+/**
+ The locale of the receiver.
+
+ The locale determines the output language as well as the numeral system used
+ when the `relativeToUser` property is set to `YES`.
+ */
+@property (copy) NSLocale *locale;
+
+/**
+ Returns a heading string for the provided value.
+
+ @param direction The heading, measured in degrees.
+ @return The heading string appropriately formatted for the formatter’s locale.
+ */
+- (NSString *)stringFromDirection:(CLLocationDirection)direction;
+
+/**
+ This method is not supported for the `MGLDirectionFormatter` class.
+ */
+- (BOOL)getObjectValue:(out id __nullable * __nullable)obj forString:(NSString *)string errorDescription:(out NSString * __nullable * __nullable)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/darwin/src/MGLDirectionFormatter.m b/platform/darwin/src/MGLDirectionFormatter.m
new file mode 100644
index 0000000000..ca0468f508
--- /dev/null
+++ b/platform/darwin/src/MGLDirectionFormatter.m
@@ -0,0 +1,167 @@
+#import "MGLDirectionFormatter.h"
+
+#define wrap(value, min, max) \
+ (fmod((fmod((value - min), (max - min)) + (max - min)), (max - min)) + min)
+
+@implementation MGLDirectionFormatter {
+ NSNumberFormatter *_numberFormatter;
+}
+
+- (instancetype)init {
+ if (self = [super init]) {
+ _unitStyle = NSFormattingUnitStyleMedium;
+ _numberFormatter = [[NSNumberFormatter alloc] init];
+ }
+ return self;
+}
+
+- (NSLocale *)locale {
+ return _numberFormatter.locale;
+}
+
+- (void)setLocale:(NSLocale *)locale {
+ _numberFormatter.locale = locale;
+}
+
+- (NSString *)stringFromDirection:(CLLocationDirection)direction {
+ if (self.origin == MGLDirectionFormatterOriginNorth) {
+ return [self stringFromAbsoluteDirection:direction];
+ } else {
+ return [self stringFromRelativeDirection:direction];
+ }
+}
+
+- (NSString *)stringFromRelativeDirection:(CLLocationDirection)direction {
+ NSInteger hour = round(-wrap(-direction, -360, 0) / 360 * 12);
+ NSString *format;
+ NSNumberFormatterStyle style = NSNumberFormatterDecimalStyle;
+ switch (self.unitStyle) {
+ case NSFormattingUnitStyleShort:
+ format = NSLocalizedString(@"%@:00", @"Relative heading format, short style");
+ break;
+
+ case NSFormattingUnitStyleMedium:
+ format = NSLocalizedString(@"%@ o’clock", @"Relative heading format, medium style");
+
+ break;
+
+ case NSFormattingUnitStyleLong:
+ format = NSLocalizedString(@"%@ o’clock", @"Relative heading format, long style");
+ style = NSNumberFormatterSpellOutStyle;
+ break;
+
+ default:
+ break;
+ }
+ _numberFormatter.numberStyle = style;
+ return [NSString stringWithFormat:format, [_numberFormatter stringFromNumber:@(hour)]];
+}
+
+- (NSString *)stringFromAbsoluteDirection:(CLLocationDirection)direction {
+ static NS_ARRAY_OF(NSString *) *shortStrings;
+ static NS_ARRAY_OF(NSString *) *longStrings;
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ shortStrings = @[
+ NSLocalizedString(@"N", @"North, short"),
+ NSLocalizedString(@"N×E", @"North by east, short"),
+ NSLocalizedString(@"NNE", @"North-northeast, short"),
+ NSLocalizedString(@"NE×N", @"Northeast by north, short"),
+ NSLocalizedString(@"NE", @"Northeast, short"),
+ NSLocalizedString(@"NE×E", @"Northeast by east, short"),
+ NSLocalizedString(@"ENE", @"East-northeast, short"),
+ NSLocalizedString(@"E×N", @"East by north, short"),
+
+ NSLocalizedString(@"E", @"East, short"),
+ NSLocalizedString(@"E×S", @"East by south, short"),
+ NSLocalizedString(@"ESE", @"East-southeast, short"),
+ NSLocalizedString(@"SE×E", @"Southeast by east, short"),
+ NSLocalizedString(@"SE", @"Southeast, short"),
+ NSLocalizedString(@"SE×S", @"Southeast by south, short"),
+ NSLocalizedString(@"SSE", @"South-southeast, short"),
+ NSLocalizedString(@"S×E", @"South by east, short"),
+
+ NSLocalizedString(@"S", @"South, short"),
+ NSLocalizedString(@"S×W", @"South by west, short"),
+ NSLocalizedString(@"SSW", @"South-southwest, short"),
+ NSLocalizedString(@"SW×S", @"Southwest by south, short"),
+ NSLocalizedString(@"SW", @"Southwest, short"),
+ NSLocalizedString(@"SW×W", @"Southwest by west, short"),
+ NSLocalizedString(@"WSW", @"West-southwest, short"),
+ NSLocalizedString(@"W×S", @"West by south, short"),
+
+ NSLocalizedString(@"W", @"West, short"),
+ NSLocalizedString(@"W×N", @"West by north, short"),
+ NSLocalizedString(@"WNW", @"West-northwest, short"),
+ NSLocalizedString(@"NW×W", @"Northwest by west, short"),
+ NSLocalizedString(@"NW", @"Northwest, short"),
+ NSLocalizedString(@"NW×N", @"Northwest by north, short"),
+ NSLocalizedString(@"NNW", @"North-northwest, short"),
+ NSLocalizedString(@"N×W", @"North by west, short"),
+ ];
+
+ longStrings = @[
+ NSLocalizedString(@"north", @"North, long"),
+ NSLocalizedString(@"north by east", @"North by east, long"),
+ NSLocalizedString(@"north-northeast", @"North-northeast, long"),
+ NSLocalizedString(@"northeast by north", @"Northeast by north, long"),
+ NSLocalizedString(@"northeast", @"Northeast, long"),
+ NSLocalizedString(@"northeast by east", @"Northeast by east, long"),
+ NSLocalizedString(@"east-northeast", @"East-northeast, long"),
+ NSLocalizedString(@"east by north", @"East by north, long"),
+
+ NSLocalizedString(@"east", @"East, long"),
+ NSLocalizedString(@"east by south", @"East by south, long"),
+ NSLocalizedString(@"east-southeast", @"East-southeast, long"),
+ NSLocalizedString(@"southeast by east", @"Southeast by east, long"),
+ NSLocalizedString(@"southeast", @"Southeast, long"),
+ NSLocalizedString(@"southeast by south", @"Southeast by south, long"),
+ NSLocalizedString(@"south-southeast", @"South-southeast, long"),
+ NSLocalizedString(@"south by east", @"South by east, long"),
+
+ NSLocalizedString(@"south", @"South, long"),
+ NSLocalizedString(@"south by west", @"South by west, long"),
+ NSLocalizedString(@"south-southwest", @"South-southwest, long"),
+ NSLocalizedString(@"southwest by south", @"Southwest by south, long"),
+ NSLocalizedString(@"southwest", @"Southwest, long"),
+ NSLocalizedString(@"southwest by west", @"Southwest by west, long"),
+ NSLocalizedString(@"west-southwest", @"West-southwest, long"),
+ NSLocalizedString(@"west by south", @"West by south, long"),
+
+ NSLocalizedString(@"west", @"West, long"),
+ NSLocalizedString(@"west by north", @"West by north, long"),
+ NSLocalizedString(@"west-northwest", @"West-northwest, long"),
+ NSLocalizedString(@"northwest by west", @"Northwest by west, long"),
+ NSLocalizedString(@"northwest", @"Northwest, long"),
+ NSLocalizedString(@"northwest by north", @"Northwest by north, long"),
+ NSLocalizedString(@"north-northwest", @"North-northwest, long"),
+ NSLocalizedString(@"north by west", @"North by west, long"),
+ ];
+
+ NSAssert(shortStrings.count == longStrings.count, @"Long and short direction string arrays must have the same size.");
+ });
+
+ NSInteger cardinalPoint = round(wrap(direction, 0, 360) / 360 * shortStrings.count);
+ switch (self.unitStyle) {
+ case NSFormattingUnitStyleShort:
+ return shortStrings[cardinalPoint];
+
+ case NSFormattingUnitStyleMedium:
+ case NSFormattingUnitStyleLong:
+ return longStrings[cardinalPoint];
+ }
+}
+
+- (nullable NSString *)stringForObjectValue:(id)obj {
+ if (![obj isKindOfClass:[NSValue class]]) {
+ return nil;
+ }
+ return [self stringFromDirection:[obj doubleValue]];
+}
+
+- (BOOL)getObjectValue:(out id __nullable * __nullable)obj forString:(NSString *)string errorDescription:(out NSString * __nullable * __nullable)error {
+ NSAssert(NO, @"-getObjectValue:forString:errorDescription: has not been implemented");
+ return NO;
+}
+
+@end
diff --git a/platform/darwin/test/MGLDirectionFormatterTests.m b/platform/darwin/test/MGLDirectionFormatterTests.m
new file mode 100644
index 0000000000..81c5223068
--- /dev/null
+++ b/platform/darwin/test/MGLDirectionFormatterTests.m
@@ -0,0 +1,111 @@
+#import <Mapbox/Mapbox.h>
+#import <XCTest/XCTest.h>
+
+static NSString * const MGLTestLocaleIdentifier = @"en-US";
+
+@interface MGLDirectionFormatterTests : XCTestCase
+
+@end
+
+@implementation MGLDirectionFormatterTests
+
+- (void)testAbsoluteDirections {
+ MGLDirectionFormatter *shortFormatter = [[MGLDirectionFormatter alloc] init];
+ XCTAssertEqual(shortFormatter.origin, MGLDirectionFormatterOriginNorth, @"Reference point should be north by default.");
+ shortFormatter.unitStyle = NSFormattingUnitStyleShort;
+ shortFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ MGLDirectionFormatter *mediumFormatter = [[MGLDirectionFormatter alloc] init];
+ XCTAssertEqual(mediumFormatter.unitStyle, NSFormattingUnitStyleMedium, @"Unit style should be medium by default.");
+ mediumFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ MGLDirectionFormatter *longFormatter = [[MGLDirectionFormatter alloc] init];
+ longFormatter.unitStyle = NSFormattingUnitStyleLong;
+ longFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ XCTAssertEqualObjects(@"NW", [shortFormatter stringFromDirection:-45]);
+ XCTAssertEqualObjects(@"northwest", [mediumFormatter stringFromDirection:-45]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:-45], [longFormatter stringFromDirection:-45]);
+
+ XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:0]);
+ XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:0]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:0], [longFormatter stringFromDirection:0]);
+
+ XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:1]);
+ XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:1]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:1], [longFormatter stringFromDirection:1]);
+
+ XCTAssertEqualObjects(@"N×E", [shortFormatter stringFromDirection:10]);
+ XCTAssertEqualObjects(@"north by east", [mediumFormatter stringFromDirection:10]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:10], [longFormatter stringFromDirection:10]);
+
+ XCTAssertEqualObjects(@"NNE", [shortFormatter stringFromDirection:20]);
+ XCTAssertEqualObjects(@"north-northeast", [mediumFormatter stringFromDirection:20]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:20], [longFormatter stringFromDirection:20]);
+
+ XCTAssertEqualObjects(@"NE", [shortFormatter stringFromDirection:45]);
+ XCTAssertEqualObjects(@"northeast", [mediumFormatter stringFromDirection:45]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:45], [longFormatter stringFromDirection:45]);
+
+ XCTAssertEqualObjects(@"E", [shortFormatter stringFromDirection:90]);
+ XCTAssertEqualObjects(@"east", [mediumFormatter stringFromDirection:90]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:90], [longFormatter stringFromDirection:90]);
+
+ XCTAssertEqualObjects(@"S", [shortFormatter stringFromDirection:180]);
+ XCTAssertEqualObjects(@"south", [mediumFormatter stringFromDirection:180]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:180], [longFormatter stringFromDirection:180]);
+
+ XCTAssertEqualObjects(@"W", [shortFormatter stringFromDirection:270]);
+ XCTAssertEqualObjects(@"west", [mediumFormatter stringFromDirection:270]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:270], [longFormatter stringFromDirection:270]);
+
+ XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:360]);
+ XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:360]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:360], [longFormatter stringFromDirection:360]);
+
+ XCTAssertEqualObjects(@"N", [shortFormatter stringFromDirection:720]);
+ XCTAssertEqualObjects(@"north", [mediumFormatter stringFromDirection:720]);
+ XCTAssertEqualObjects([mediumFormatter stringFromDirection:720], [longFormatter stringFromDirection:720]);
+}
+
+- (void)testRelativeDirections {
+ MGLDirectionFormatter *shortFormatter = [[MGLDirectionFormatter alloc] init];
+ shortFormatter.origin = MGLDirectionFormatterOriginStraightAhead;
+ shortFormatter.unitStyle = NSFormattingUnitStyleShort;
+ shortFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ MGLDirectionFormatter *mediumFormatter = [[MGLDirectionFormatter alloc] init];
+ mediumFormatter.origin = MGLDirectionFormatterOriginStraightAhead;
+ mediumFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ MGLDirectionFormatter *longFormatter = [[MGLDirectionFormatter alloc] init];
+ longFormatter.origin = MGLDirectionFormatterOriginStraightAhead;
+ longFormatter.unitStyle = NSFormattingUnitStyleLong;
+ longFormatter.locale = [NSLocale localeWithLocaleIdentifier:MGLTestLocaleIdentifier];
+
+ XCTAssertEqualObjects(@"9:00", [shortFormatter stringFromDirection:-90]);
+ XCTAssertEqualObjects(@"9 o’clock", [mediumFormatter stringFromDirection:-90]);
+ XCTAssertEqualObjects(@"nine o’clock", [longFormatter stringFromDirection:-90]);
+
+ XCTAssertEqualObjects(@"12:00", [shortFormatter stringFromDirection:0]);
+ XCTAssertEqualObjects(@"12 o’clock", [mediumFormatter stringFromDirection:0]);
+ XCTAssertEqualObjects(@"twelve o’clock", [longFormatter stringFromDirection:0]);
+
+ XCTAssertEqualObjects(@"2:00", [shortFormatter stringFromDirection:45]);
+ XCTAssertEqualObjects(@"2 o’clock", [mediumFormatter stringFromDirection:45]);
+ XCTAssertEqualObjects(@"two o’clock", [longFormatter stringFromDirection:45]);
+
+ XCTAssertEqualObjects(@"3:00", [shortFormatter stringFromDirection:90]);
+ XCTAssertEqualObjects(@"3 o’clock", [mediumFormatter stringFromDirection:90]);
+ XCTAssertEqualObjects(@"three o’clock", [longFormatter stringFromDirection:90]);
+
+ XCTAssertEqualObjects(@"6:00", [shortFormatter stringFromDirection:180]);
+ XCTAssertEqualObjects(@"6 o’clock", [mediumFormatter stringFromDirection:180]);
+ XCTAssertEqualObjects(@"six o’clock", [longFormatter stringFromDirection:180]);
+
+ XCTAssertEqualObjects(@"9:00", [shortFormatter stringFromDirection:270]);
+ XCTAssertEqualObjects(@"9 o’clock", [mediumFormatter stringFromDirection:270]);
+ XCTAssertEqualObjects(@"nine o’clock", [longFormatter stringFromDirection:270]);
+}
+
+@end
diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md
index 875b0dd7a6..ba1c635175 100644
--- a/platform/ios/CHANGELOG.md
+++ b/platform/ios/CHANGELOG.md
@@ -12,7 +12,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CON
- Fixed an issue preventing KVO change notifications from being generated on MGLMapView’s `userTrackingMode` key path when `-setUserTrackingMode:animated:` is called. ([#4724](https://github.com/mapbox/mapbox-gl-native/pull/4724))
- Rendering now occurs on the main thread, fixing a hang when calling `-[MGLMapView styleURL]` before the map view has fully loaded or while the application is in the background. ([#2909](https://github.com/mapbox/mapbox-gl-native/pull/2909))
- Added category methods on NSValue for converting to and from the structure types defined in MGLGeometry.h. ([#4802](https://github.com/mapbox/mapbox-gl-native/pull/4802))
-- Added MGLCoordinateFormatter for converting geographic coordinates into display strings. ([#4802](https://github.com/mapbox/mapbox-gl-native/pull/4802))
+- Added NSFormatter subclasses for converting geographic coordinates and directions into display strings. ([#4802](https://github.com/mapbox/mapbox-gl-native/pull/4802))
- Added a `-reloadStyle:` action to MGLMapView to force a reload of the current style. ([#4728](https://github.com/mapbox/mapbox-gl-native/pull/4728))
- A more specific user agent string is now sent with style and tile requests. ([#4012](https://github.com/mapbox/mapbox-gl-native/pull/4012))
- Mapbox Telemetry is automatically disabled while the host application is running in the iOS Simulator. ([#4726](https://github.com/mapbox/mapbox-gl-native/pull/4726))
diff --git a/platform/ios/framework/Mapbox.h b/platform/ios/framework/Mapbox.h
index 68579933b6..db6aba1495 100644
--- a/platform/ios/framework/Mapbox.h
+++ b/platform/ios/framework/Mapbox.h
@@ -11,6 +11,7 @@ FOUNDATION_EXPORT const unsigned char MapboxVersionString[];
#import "MGLAnnotationImage.h"
#import "MGLCalloutView.h"
#import "MGLCoordinateFormatter.h"
+#import "MGLDirectionFormatter.h"
#import "MGLMapCamera.h"
#import "MGLGeometry.h"
#import "MGLMapView.h"
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj
index 50f2a79dea..5ee63c1c5c 100644
--- a/platform/ios/ios.xcodeproj/project.pbxproj
+++ b/platform/ios/ios.xcodeproj/project.pbxproj
@@ -33,6 +33,10 @@
DA35A2A11CC9E95F00E826B2 /* MGLCoordinateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A01CC9E95F00E826B2 /* MGLCoordinateFormatter.m */; };
DA35A2A21CC9E95F00E826B2 /* MGLCoordinateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A01CC9E95F00E826B2 /* MGLCoordinateFormatter.m */; };
DA35A2AA1CCA058D00E826B2 /* MGLCoordinateFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A91CCA058D00E826B2 /* MGLCoordinateFormatterTests.m */; };
+ DA35A2B11CCA141D00E826B2 /* MGLDirectionFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A2AF1CCA141D00E826B2 /* MGLDirectionFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DA35A2B21CCA141D00E826B2 /* MGLDirectionFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A2AF1CCA141D00E826B2 /* MGLDirectionFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DA35A2B31CCA141D00E826B2 /* MGLDirectionFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2B01CCA141D00E826B2 /* MGLDirectionFormatter.m */; };
+ DA35A2B41CCA141D00E826B2 /* MGLDirectionFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2B01CCA141D00E826B2 /* MGLDirectionFormatter.m */; };
DA4A26941CB6E337000B7809 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA1DC9561CB6C1C2006E619F /* Main.storyboard */; };
DA4A26951CB6E337000B7809 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA1DC95B1CB6C1C2006E619F /* LaunchScreen.storyboard */; };
DA8847D91CBAF91600AB86E3 /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA8847D21CBAF91600AB86E3 /* Mapbox.framework */; };
@@ -277,6 +281,8 @@
DA35A29D1CC9E94C00E826B2 /* MGLCoordinateFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGLCoordinateFormatter.h; path = include/MGLCoordinateFormatter.h; sourceTree = "<group>"; };
DA35A2A01CC9E95F00E826B2 /* MGLCoordinateFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCoordinateFormatter.m; path = src/MGLCoordinateFormatter.m; sourceTree = "<group>"; };
DA35A2A91CCA058D00E826B2 /* MGLCoordinateFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCoordinateFormatterTests.m; path = ../../darwin/test/MGLCoordinateFormatterTests.m; sourceTree = "<group>"; };
+ DA35A2AF1CCA141D00E826B2 /* MGLDirectionFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGLDirectionFormatter.h; path = include/MGLDirectionFormatter.h; sourceTree = "<group>"; };
+ DA35A2B01CCA141D00E826B2 /* MGLDirectionFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLDirectionFormatter.m; path = src/MGLDirectionFormatter.m; sourceTree = "<group>"; };
DA4A26961CB6E795000B7809 /* Mapbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Mapbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DA8847D21CBAF91600AB86E3 /* Mapbox.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Mapbox.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DA8847D61CBAF91600AB86E3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -545,6 +551,8 @@
DA8847E01CBAFA5100AB86E3 /* MGLAnnotation.h */,
DA35A29D1CC9E94C00E826B2 /* MGLCoordinateFormatter.h */,
DA35A2A01CC9E95F00E826B2 /* MGLCoordinateFormatter.m */,
+ DA35A2AF1CCA141D00E826B2 /* MGLDirectionFormatter.h */,
+ DA35A2B01CCA141D00E826B2 /* MGLDirectionFormatter.m */,
DA8847E11CBAFA5100AB86E3 /* MGLGeometry.h */,
DA8848011CBAFA6200AB86E3 /* MGLGeometry_Private.h */,
DA8848021CBAFA6200AB86E3 /* MGLGeometry.mm */,
@@ -754,6 +762,7 @@
DA88481E1CBAFA6200AB86E3 /* MGLMultiPoint_Private.h in Headers */,
DA35A29E1CC9E94C00E826B2 /* MGLCoordinateFormatter.h in Headers */,
DA8847F71CBAFA5100AB86E3 /* MGLOverlay.h in Headers */,
+ DA35A2B11CCA141D00E826B2 /* MGLDirectionFormatter.h in Headers */,
DA88488B1CBB037E00AB86E3 /* SMCalloutView.h in Headers */,
DA8847FE1CBAFA5100AB86E3 /* MGLTypes.h in Headers */,
DA8847F11CBAFA5100AB86E3 /* MGLGeometry.h in Headers */,
@@ -799,6 +808,7 @@
DABFB8681CBE99E500D62B32 /* MGLPolyline.h in Headers */,
DABFB86F1CBE9A0F00D62B32 /* MGLMapView.h in Headers */,
DABFB8631CBE99E500D62B32 /* MGLOfflineRegion.h in Headers */,
+ DA35A2B21CCA141D00E826B2 /* MGLDirectionFormatter.h in Headers */,
DABFB8731CBE9A9900D62B32 /* Mapbox.h in Headers */,
DABFB86B1CBE99E500D62B32 /* MGLTilePyramidOfflineRegion.h in Headers */,
DABFB85F1CBE99E500D62B32 /* MGLGeometry.h in Headers */,
@@ -1051,6 +1061,7 @@
DA8848591CBAFB9800AB86E3 /* MGLMapView.mm in Sources */,
DA8848501CBAFB9800AB86E3 /* MGLAnnotationImage.m in Sources */,
DA8848281CBAFA6200AB86E3 /* MGLShape.m in Sources */,
+ DA35A2B31CCA141D00E826B2 /* MGLDirectionFormatter.m in Sources */,
DA8848321CBAFA6200AB86E3 /* NSString+MGLAdditions.m in Sources */,
DA35A2A11CC9E95F00E826B2 /* MGLCoordinateFormatter.m in Sources */,
DA8848291CBAFA6200AB86E3 /* MGLStyle.mm in Sources */,
@@ -1085,6 +1096,7 @@
DAA4E4261CBB730400178DFB /* MGLStyle.mm in Sources */,
DAA4E41D1CBB730400178DFB /* MGLGeometry.mm in Sources */,
DAA4E41F1CBB730400178DFB /* MGLMultiPoint.mm in Sources */,
+ DA35A2B41CCA141D00E826B2 /* MGLDirectionFormatter.m in Sources */,
DAA4E4281CBB730400178DFB /* MGLTypes.m in Sources */,
DA35A2A21CC9E95F00E826B2 /* MGLCoordinateFormatter.m in Sources */,
DAA4E42D1CBB730400178DFB /* MGLAnnotationImage.m in Sources */,
diff --git a/platform/osx/osx.xcodeproj/project.pbxproj b/platform/osx/osx.xcodeproj/project.pbxproj
index dc7030a949..f31d5f6e55 100644
--- a/platform/osx/osx.xcodeproj/project.pbxproj
+++ b/platform/osx/osx.xcodeproj/project.pbxproj
@@ -11,6 +11,9 @@
DA35A2A41CC9EB1A00E826B2 /* MGLCoordinateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A2A31CC9EB1A00E826B2 /* MGLCoordinateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
DA35A2A61CC9EB2700E826B2 /* MGLCoordinateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A51CC9EB2700E826B2 /* MGLCoordinateFormatter.m */; };
DA35A2A81CC9F41600E826B2 /* MGLCoordinateFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2A71CC9F41600E826B2 /* MGLCoordinateFormatterTests.m */; };
+ DA35A2AD1CCA091800E826B2 /* MGLDirectionFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A2AB1CCA091800E826B2 /* MGLDirectionFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DA35A2AE1CCA091800E826B2 /* MGLDirectionFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2AC1CCA091800E826B2 /* MGLDirectionFormatter.m */; };
+ DA35A2B61CCA14D700E826B2 /* MGLDirectionFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA35A2B51CCA14D700E826B2 /* MGLDirectionFormatterTests.m */; };
DA839E971CC2E3400062CAFB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DA839E961CC2E3400062CAFB /* AppDelegate.m */; };
DA839E9A1CC2E3400062CAFB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DA839E991CC2E3400062CAFB /* main.m */; };
DA839E9D1CC2E3400062CAFB /* MapDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = DA839E9C1CC2E3400062CAFB /* MapDocument.m */; };
@@ -139,6 +142,9 @@
DA35A2A31CC9EB1A00E826B2 /* MGLCoordinateFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGLCoordinateFormatter.h; path = include/MGLCoordinateFormatter.h; sourceTree = "<group>"; };
DA35A2A51CC9EB2700E826B2 /* MGLCoordinateFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCoordinateFormatter.m; path = src/MGLCoordinateFormatter.m; sourceTree = "<group>"; };
DA35A2A71CC9F41600E826B2 /* MGLCoordinateFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCoordinateFormatterTests.m; path = ../../darwin/test/MGLCoordinateFormatterTests.m; sourceTree = "<group>"; };
+ DA35A2AB1CCA091800E826B2 /* MGLDirectionFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGLDirectionFormatter.h; path = include/MGLDirectionFormatter.h; sourceTree = "<group>"; };
+ DA35A2AC1CCA091800E826B2 /* MGLDirectionFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLDirectionFormatter.m; path = src/MGLDirectionFormatter.m; sourceTree = "<group>"; };
+ DA35A2B51CCA14D700E826B2 /* MGLDirectionFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLDirectionFormatterTests.m; path = ../../darwin/test/MGLDirectionFormatterTests.m; sourceTree = "<group>"; };
DA839E921CC2E3400062CAFB /* Mapbox GL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mapbox GL.app"; sourceTree = BUILT_PRODUCTS_DIR; };
DA839E951CC2E3400062CAFB /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
DA839E961CC2E3400062CAFB /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
@@ -352,6 +358,7 @@
isa = PBXGroup;
children = (
DA35A2A71CC9F41600E826B2 /* MGLCoordinateFormatterTests.m */,
+ DA35A2B51CCA14D700E826B2 /* MGLDirectionFormatterTests.m */,
DAE6C3C81CC34BD800DB3429 /* MGLGeometryTests.mm */,
DAE6C3C91CC34BD800DB3429 /* MGLOfflinePackTests.m */,
DAE6C3CA1CC34BD800DB3429 /* MGLOfflineRegionTests.m */,
@@ -372,6 +379,8 @@
DAE6C34B1CC31E0400DB3429 /* MGLAnnotation.h */,
DA35A2A31CC9EB1A00E826B2 /* MGLCoordinateFormatter.h */,
DA35A2A51CC9EB2700E826B2 /* MGLCoordinateFormatter.m */,
+ DA35A2AB1CCA091800E826B2 /* MGLDirectionFormatter.h */,
+ DA35A2AC1CCA091800E826B2 /* MGLDirectionFormatter.m */,
DAE6C34C1CC31E0400DB3429 /* MGLGeometry.h */,
DAE6C36C1CC31E2A00DB3429 /* MGLGeometry_Private.h */,
DAE6C36D1CC31E2A00DB3429 /* MGLGeometry.mm */,
@@ -495,6 +504,7 @@
DAE6C3B91CC31EF300DB3429 /* MGLOpenGLLayer.h in Headers */,
DAE6C3891CC31E2A00DB3429 /* MGLMultiPoint_Private.h in Headers */,
DAE6C3A51CC31E9400DB3429 /* MGLMapView+IBAdditions.h in Headers */,
+ DA35A2AD1CCA091800E826B2 /* MGLDirectionFormatter.h in Headers */,
DAE6C3671CC31E0400DB3429 /* MGLStyle.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -672,6 +682,7 @@
DAE6C3851CC31E2A00DB3429 /* MGLAccountManager.m in Sources */,
DAE6C3921CC31E2A00DB3429 /* MGLPolyline.mm in Sources */,
DAE6C3B51CC31EF300DB3429 /* MGLCompassCell.m in Sources */,
+ DA35A2AE1CCA091800E826B2 /* MGLDirectionFormatter.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -681,6 +692,7 @@
files = (
DAE6C3D41CC34C9900DB3429 /* MGLOfflineRegionTests.m in Sources */,
DAE6C3D61CC34C9900DB3429 /* MGLStyleTests.mm in Sources */,
+ DA35A2B61CCA14D700E826B2 /* MGLDirectionFormatterTests.m in Sources */,
DAE6C3D21CC34C9900DB3429 /* MGLGeometryTests.mm in Sources */,
DAE6C3D51CC34C9900DB3429 /* MGLOfflineStorageTests.m in Sources */,
DAE6C3D31CC34C9900DB3429 /* MGLOfflinePackTests.m in Sources */,
diff --git a/platform/osx/sdk/Mapbox.h b/platform/osx/sdk/Mapbox.h
index 49d5cab728..4fc2e129c2 100644
--- a/platform/osx/sdk/Mapbox.h
+++ b/platform/osx/sdk/Mapbox.h
@@ -9,6 +9,7 @@ FOUNDATION_EXPORT const unsigned char MapboxVersionString[];
#import <Mapbox/MGLAccountManager.h>
#import <Mapbox/MGLAnnotation.h>
#import <Mapbox/MGLAnnotationImage.h>
+#import <Mapbox/MGLDirectionFormatter.h>
#import <Mapbox/MGLCoordinateFormatter.h>
#import <Mapbox/MGLGeometry.h>
#import <Mapbox/MGLMapCamera.h>