[ios, osx] Direction formatter
Implemented an NSFormatter for formatting CLLocationDirection values as localizable display strings. The formatter supports both absolute compass directions, such as “south”, and relative “clock” directions, such as “6 o’clock”.
This commit is contained in:
committed by
Minh Nguyễn
parent
91023f02f8
commit
e5c6cfde4b
@@ -69,6 +69,8 @@ custom_categories:
|
||||
- MGLCoordinateSpanMake
|
||||
- MGLCoordinateSpanZero
|
||||
- MGLDegreesFromRadians
|
||||
- MGLDirectionFormatter
|
||||
- MGLDirectionFormatterOrigin
|
||||
- MGLRadiansFromDegrees
|
||||
- MGLStringFromCoordinateBounds
|
||||
- NSValue(MGLGeometryAdditions)
|
||||
|
||||
77
platform/darwin/include/MGLDirectionFormatter.h
Normal file
77
platform/darwin/include/MGLDirectionFormatter.h
Normal file
@@ -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
|
||||
167
platform/darwin/src/MGLDirectionFormatter.m
Normal file
167
platform/darwin/src/MGLDirectionFormatter.m
Normal file
@@ -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
|
||||
111
platform/darwin/test/MGLDirectionFormatterTests.m
Normal file
111
platform/darwin/test/MGLDirectionFormatterTests.m
Normal file
@@ -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
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user