Merge branch 'release-ios-v3.4.0' into 1ec5-release-ios-v3.4.0-beta.2-master
This commit is contained in:
@@ -7,9 +7,10 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
### Packaging
|
||||
|
||||
* Xcode 7.3 or above is required for using this SDK. ([#6059](https://github.com/mapbox/mapbox-gl-native/issues/6059))
|
||||
* Fixed an issue with symbols not being properly stripped from the dynamic framework. The dSYM file included with the standard dynamic framework in previous releases (e.g., `mapbox-ios-sdk-3.3.4-dynamic.zip` or the `Mapbox-iOS-SDK` pod) could not be used to symbolicate crashes. ([#6531](https://github.com/mapbox/mapbox-gl-native/pull/6531))
|
||||
* Fixed an issue with symbols not being properly stripped from the dynamic framework. The dSYM file included with the standard dynamic framework in previous releases (e.g., `mapbox-ios-sdk-3.3.5-dynamic.zip` or the `Mapbox-iOS-SDK` pod) could not be used to symbolicate crashes. ([#6531](https://github.com/mapbox/mapbox-gl-native/pull/6531))
|
||||
* Simulator architecture slices are included in the included dSYM file, allowing you to symbolicate crashes that occur in the Simulator. ([#5740](https://github.com/mapbox/mapbox-gl-native/pull/5740))
|
||||
* Clarified that the `-ObjC` linker flag is required for linking against the static framework distribution of this SDK. ([#6213](https://github.com/mapbox/mapbox-gl-native/pull/6213))
|
||||
* Added documentation for the Info.plist keys used by this SDK. ([#6833](https://github.com/mapbox/mapbox-gl-native/pull/6833))
|
||||
|
||||
### Styles and data
|
||||
|
||||
@@ -18,8 +19,11 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
* GeoJSON sources specified by the stylesheet at design time now support `cluster`, `clusterMaxZoom`, and `clusterRadius` attributes for clustering point features on the base map. ([#5724](https://github.com/mapbox/mapbox-gl-native/pull/5724))
|
||||
* Added [quadkey](https://msdn.microsoft.com/en-us/library/bb259689.aspx) support and limited WMS support in raster tile URL templates. ([#5628](https://github.com/mapbox/mapbox-gl-native/pull/5628))
|
||||
* TileJSON manifests can now specify `"scheme": "tms"` to indicate the use of [TMS](https://en.wikipedia.org/wiki/Tile_Map_Service) coordinates. ([#2270](https://github.com/mapbox/mapbox-gl-native/pull/2270))
|
||||
* Fixed an issue causing abstract MGLMultiPointFeature objects to be returned in feature query results. Now concrete MGLPointCollectionFeature objects are returned. ([#6742](https://github.com/mapbox/mapbox-gl-native/pull/6742))
|
||||
* Fixed rendering artifacts and missing glyphs that occurred after viewing a large number of CJK characters on the map. ([#5908](https://github.com/mapbox/mapbox-gl-native/pull/5908))
|
||||
* `-[MGLMapView resetPosition]` now resets to the current style’s default center coordinates, zoom level, direction, and pitch, if specified. ([#6127](https://github.com/mapbox/mapbox-gl-native/pull/6127))
|
||||
* Fixed an issue where feature querying sometimes failed to return the expected features when the map was tilted. ([#6773](https://github.com/mapbox/mapbox-gl-native/pull/6773))
|
||||
* MGLFeature’s `attributes` and `identifier` properties are now writable. ([#6728](https://github.com/mapbox/mapbox-gl-native/pull/6728))
|
||||
* The `text-pitch-alignment` property is now supported in stylesheets for improved street label legibility on a tilted map. ([#5288](https://github.com/mapbox/mapbox-gl-native/pull/5288))
|
||||
* The `icon-text-fit` and `icon-text-fit-padding` properties are now supported in stylesheets, allowing the background of a shield to automatically resize to fit the shield’s text. ([#5334](https://github.com/mapbox/mapbox-gl-native/pull/5334))
|
||||
* The `circle-pitch-scale` property is now supported in stylesheets, allowing circle features in a tilted base map to scale or remain the same size as the viewing distance changes. ([#5576](https://github.com/mapbox/mapbox-gl-native/pull/5576))
|
||||
@@ -31,6 +35,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
* A source’s tiles are no longer rendered when the map is outside the source’s supported zoom levels. ([#6345](https://github.com/mapbox/mapbox-gl-native/pull/6345))
|
||||
* Improved style parsing performance. ([#6170](https://github.com/mapbox/mapbox-gl-native/pull/6170))
|
||||
* Improved feature querying performance. ([#6514](https://github.com/mapbox/mapbox-gl-native/pull/6514))
|
||||
* Fixed an issue where shapes that cannot currently be visually represented as annotations were still shown on the map as point annotations. ([#6764](https://github.com/mapbox/mapbox-gl-native/issues/6764))
|
||||
|
||||
### User location
|
||||
|
||||
@@ -43,16 +48,18 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
### Annotations
|
||||
|
||||
* MGLPolyline annotations and the exterior coordinates of MGLPolygon annotations are now able to be mutated, part or all, and changes are displayed immediately. ([#6565](https://github.com/mapbox/mapbox-gl-native/pull/6565))
|
||||
* Added new APIs to MGLMapView to query for visible annotations. Combined with `-[MGLMapView viewForAnnotation:]`, these APIs can be used to access all visible annotation views. ([6061](https://github.com/mapbox/mapbox-gl-native/pull/6061))
|
||||
* Fixed an issue causing offscreen annotation views to be updated even when they were in the reuse queue. ([#5987](https://github.com/mapbox/mapbox-gl-native/pull/5987))
|
||||
* Fixed an issue preventing MGLAnnotationView from animating when its coordinate changes. ([#6215](https://github.com/mapbox/mapbox-gl-native/pull/6215))
|
||||
* Fixed an issue causing the wrong annotation view to be selected when tapping an annotation view with a center offset applied. ([#5931](https://github.com/mapbox/mapbox-gl-native/pull/5931))
|
||||
* Fixed an issue that assigned annotation views to polyline and polygon annotations. ([#5770](https://github.com/mapbox/mapbox-gl-native/pull/5770))
|
||||
* Per documentation, the first and last coordinates in an MGLPolygon must be identical in order for the polygon to draw correctly. The same is true for an MGLPolygon’s interior polygon. ([#5514](https://github.com/mapbox/mapbox-gl-native/pull/5514))
|
||||
* To make an MGLPolyline or MGLPolygon span the antimeridian, specify coordinates with longitudes greater than 180° or less than −180°. ([#6088](https://github.com/mapbox/mapbox-gl-native/pull/6088))
|
||||
* Deprecated `-[MGLMapViewDelegate mapView:alphaForShapeAnnotation:]` in favor of specifying an alpha component via `-[MGLMapViewDelegate mapView:strokeColorForShapeAnnotation:]` or `-[MGLMapViewDelegate mapView:fillColorForPolygonAnnotation:]`. ([#6706](https://github.com/mapbox/mapbox-gl-native/pull/6706))
|
||||
* Fixed an issue that caused an annotation view to disappear if it isn’t created using the annotation view reuse queue. ([#6485](https://github.com/mapbox/mapbox-gl-native/pull/6485))
|
||||
* Fixed an issue that could reset user-added transformations on annotation views. ([#6166](https://github.com/mapbox/mapbox-gl-native/pull/6166))
|
||||
* Improved the performance of relocating a non-view-backed point annotation by changing its `coordinate` property. ([#5385](https://github.com/mapbox/mapbox-gl-native/pull/5385))
|
||||
* Improved the precision of annotations at zoom levels greater than 18. ([#5517](https://github.com/mapbox/mapbox-gl-native/pull/5517))
|
||||
* Fixed an issue that could reset user-added transformations on annotation views. ([#6166](https://github.com/mapbox/mapbox-gl-native/pull/6166))
|
||||
* Fixed an issue that caused an annotation view to disappear if it isn’t created using the annotation view reuse queue. ([#6485](https://github.com/mapbox/mapbox-gl-native/pull/6485))
|
||||
* Deprecated `-[MGLMapViewDelegate mapView:alphaForShapeAnnotation:]` in favor of specifying an alpha component via `-[MGLMapViewDelegate mapView:strokeColorForShapeAnnotation:]` or `-[MGLMapViewDelegate mapView:fillColorForPolygonAnnotation:]`. ([#6706](https://github.com/mapbox/mapbox-gl-native/pull/6706))
|
||||
|
||||
### Networking and offline maps
|
||||
|
||||
@@ -69,6 +76,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
|
||||
### Other changes
|
||||
|
||||
* As the user zooms in, tiles from lower zoom levels are scaled up until tiles for higher zoom levels are loaded. ([#5143](https://github.com/mapbox/mapbox-gl-native/pull/5143))
|
||||
* Notification names and user info keys are now string enumeration values for ease of use in Swift. ([#6794](https://github.com/mapbox/mapbox-gl-native/pull/6794))
|
||||
* MGLMapDebugOverdrawVisualizationMask no longer has any effect in Release builds of the SDK. This debug mask has been disabled for performance reasons. ([#5555](https://github.com/mapbox/mapbox-gl-native/pull/5555))
|
||||
* Fixed a typo in the documentation for the MGLCompassDirectionFormatter class. ([#5879](https://github.com/mapbox/mapbox-gl-native/pull/5879))
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Pod::Spec.new do |m|
|
||||
|
||||
m.name = 'Mapbox-iOS-SDK'
|
||||
m.version = '3.4.0-beta.1-symbols'
|
||||
m.version = '3.4.0-beta.2-symbols'
|
||||
|
||||
m.summary = 'Open source vector map solution for iOS with full styling capabilities.'
|
||||
m.description = 'Open source, OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa Touch APIs.'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Pod::Spec.new do |m|
|
||||
|
||||
m.name = 'Mapbox-iOS-SDK'
|
||||
m.version = '3.4.0-beta.1'
|
||||
m.version = '3.4.0-beta.2'
|
||||
|
||||
m.summary = 'Open source vector map solution for iOS with full styling capabilities.'
|
||||
m.description = 'Open source, OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa Touch APIs.'
|
||||
|
||||
@@ -51,5 +51,18 @@
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSExceptionDomains</key>
|
||||
<dict>
|
||||
<key>stamen.com</key>
|
||||
<dict>
|
||||
<key>NSIncludesSubdomains</key>
|
||||
<true/>
|
||||
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -244,7 +244,7 @@ static NSString * const MBXOfflinePacksTableViewActiveCellReuseIdentifier = @"Ac
|
||||
MGLOfflinePack *pack = notification.object;
|
||||
NSAssert([pack isKindOfClass:[MGLOfflinePack class]], @"MGLOfflineStorage notification has a non-pack object.");
|
||||
|
||||
NSError *error = notification.userInfo[MGLOfflinePackErrorUserInfoKey];
|
||||
NSError *error = notification.userInfo[MGLOfflinePackUserInfoKeyError];
|
||||
NSAssert([error isKindOfClass:[NSError class]], @"MGLOfflineStorage notification has a non-error error.");
|
||||
|
||||
NSString *message = [NSString stringWithFormat:@"Mapbox GL encountered an error while downloading the offline pack “%@”: %@", pack.name, error.localizedFailureReason];
|
||||
@@ -261,7 +261,7 @@ static NSString * const MBXOfflinePacksTableViewActiveCellReuseIdentifier = @"Ac
|
||||
MGLOfflinePack *pack = notification.object;
|
||||
NSAssert([pack isKindOfClass:[MGLOfflinePack class]], @"MGLOfflineStorage notification has a non-pack object.");
|
||||
|
||||
uint64_t maximumCount = [notification.userInfo[MGLOfflinePackMaximumCountUserInfoKey] unsignedLongLongValue];
|
||||
uint64_t maximumCount = [notification.userInfo[MGLOfflinePackUserInfoKeyMaximumCount] unsignedLongLongValue];
|
||||
NSLog(@"Offline pack “%@” reached limit of %llu tiles.", pack.name, maximumCount);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsAnnotationsRows) {
|
||||
MBXSettingsAnnotations10000Sprites,
|
||||
MBXSettingsAnnotationsTestShapes,
|
||||
MBXSettingsAnnotationsCustomCallout,
|
||||
MBXSettingsAnnotationsQueryAnnotations,
|
||||
MBXSettingsAnnotationsRemoveAnnotations,
|
||||
};
|
||||
|
||||
@@ -62,10 +63,19 @@ typedef NS_ENUM(NSInteger, MBXSettingsRuntimeStylingRows) {
|
||||
MBXSettingsRuntimeStylingFilteredLines,
|
||||
MBXSettingsRuntimeStylingNumericFilteredFill,
|
||||
MBXSettingsRuntimeStylingStyleQuery,
|
||||
MBXSettingsRuntimeStylingFeatureSource,
|
||||
MBXSettingsRuntimeStylingPointCollection,
|
||||
MBXSettingsRuntimeStylingUpdateGeoJSONSourceData,
|
||||
MBXSettingsRuntimeStylingUpdateGeoJSONSourceURL,
|
||||
MBXSettingsRuntimeStylingUpdateGeoJSONSourceFeatures,
|
||||
MBXSettingsRuntimeStylingVectorSource,
|
||||
MBXSettingsRuntimeStylingRasterSource,
|
||||
MBXSettingsRuntimeStylingCountryLabels,
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
MBXSettingsMiscellaneousWorldTour = 0,
|
||||
MBXSettingsMiscellaneousShowReuseQueueStats = 0,
|
||||
MBXSettingsMiscellaneousWorldTour,
|
||||
MBXSettingsMiscellaneousCustomUserDot,
|
||||
MBXSettingsMiscellaneousPrintLogFile,
|
||||
MBXSettingsMiscellaneousDeleteLogFile,
|
||||
@@ -93,10 +103,21 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
UITableViewDataSource,
|
||||
MGLMapViewDelegate>
|
||||
|
||||
|
||||
@property (nonatomic) IBOutlet MGLMapView *mapView;
|
||||
@property (weak, nonatomic) IBOutlet UILabel *hudLabel;
|
||||
@property (nonatomic) NSInteger styleIndex;
|
||||
@property (nonatomic) BOOL debugLoggingEnabled;
|
||||
@property (nonatomic) BOOL customUserLocationAnnnotationEnabled;
|
||||
@property (nonatomic) BOOL usingLocaleBasedCountryLabels;
|
||||
@property (nonatomic) BOOL reuseQueueStatsEnabled;
|
||||
|
||||
@end
|
||||
|
||||
@interface MGLMapView (MBXViewController)
|
||||
|
||||
@property (nonatomic) BOOL usingLocaleBasedCountryLabels;
|
||||
@property (nonatomic) NSDictionary *annotationViewReuseQueueByIdentifier;
|
||||
|
||||
@end
|
||||
|
||||
@@ -130,12 +151,8 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
[self restoreState:nil];
|
||||
|
||||
self.debugLoggingEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"MGLMapboxMetricsDebugLoggingEnabled"];
|
||||
}
|
||||
self.hudLabel.hidden = YES;
|
||||
|
||||
- (void)viewDidAppear:(BOOL)animated
|
||||
{
|
||||
[super viewDidAppear:animated];
|
||||
|
||||
if ([MGLAccountManager accessToken].length)
|
||||
{
|
||||
self.styleIndex = -1;
|
||||
@@ -289,6 +306,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
@"Add 10,000 Sprites",
|
||||
@"Add Test Shapes",
|
||||
@"Add Point With Custom Callout",
|
||||
@"Query Annotations",
|
||||
@"Remove Annotations",
|
||||
]];
|
||||
break;
|
||||
@@ -306,9 +324,19 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
@"Style Lines With Filter",
|
||||
@"Style Fill With Numeric Filter",
|
||||
@"Style Query For GeoJSON",
|
||||
@"Style Feature",
|
||||
@"Style Dynamic Point Collection",
|
||||
@"Update GeoJSON Source: Data",
|
||||
@"Update GeoJSON Source: URL",
|
||||
@"Update GeoJSON Source: Features",
|
||||
@"Style Vector Source",
|
||||
@"Style Raster Source",
|
||||
[NSString stringWithFormat:@"Label Countries in %@", (_usingLocaleBasedCountryLabels ? @"Local Language" : [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:[self bestLanguageForUser]])],
|
||||
]];
|
||||
break;
|
||||
case MBXSettingsMiscellaneous:
|
||||
[settingsTitles addObject:@"Show Reuse Queue Stats"];
|
||||
|
||||
[settingsTitles addObjectsFromArray:@[
|
||||
@"Start World Tour",
|
||||
[NSString stringWithFormat:@"%@ Custom User Dot", (_customUserLocationAnnnotationEnabled ? @"Disable" : @"Enable")],
|
||||
@@ -321,6 +349,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
@"Delete Telemetry Logfile",
|
||||
]];
|
||||
};
|
||||
|
||||
break;
|
||||
default:
|
||||
NSAssert(NO, @"All settings sections should be implemented");
|
||||
@@ -387,6 +416,9 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
case MBXSettingsAnnotationsCustomCallout:
|
||||
[self addAnnotationWithCustomCallout];
|
||||
break;
|
||||
case MBXSettingsAnnotationsQueryAnnotations:
|
||||
[self testQueryPointAnnotations];
|
||||
break;
|
||||
case MBXSettingsAnnotationsRemoveAnnotations:
|
||||
[self.mapView removeAnnotations:self.mapView.annotations];
|
||||
break;
|
||||
@@ -434,6 +466,30 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
case MBXSettingsRuntimeStylingStyleQuery:
|
||||
[self styleQuery];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingFeatureSource:
|
||||
[self styleFeature];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingPointCollection:
|
||||
[self styleDynamicPointCollection];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingUpdateGeoJSONSourceURL:
|
||||
[self updateGeoJSONSourceURL];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingUpdateGeoJSONSourceData:
|
||||
[self updateGeoJSONSourceData];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingUpdateGeoJSONSourceFeatures:
|
||||
[self updateGeoJSONSourceFeatures];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingVectorSource:
|
||||
[self styleVectorSource];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingRasterSource:
|
||||
[self styleRasterSource];
|
||||
break;
|
||||
case MBXSettingsRuntimeStylingCountryLabels:
|
||||
[self styleCountryLabelsLanguage];
|
||||
break;
|
||||
default:
|
||||
NSAssert(NO, @"All runtime styling setting rows should be implemented");
|
||||
break;
|
||||
@@ -454,6 +510,12 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
case MBXSettingsMiscellaneousDeleteLogFile:
|
||||
[self deleteTelemetryLogFile];
|
||||
break;
|
||||
case MBXSettingsMiscellaneousShowReuseQueueStats:
|
||||
{
|
||||
self.reuseQueueStatsEnabled = YES;
|
||||
self.hudLabel.hidden = NO;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
NSAssert(NO, @"All miscellaneous setting rows should be implemented");
|
||||
break;
|
||||
@@ -794,7 +856,6 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
- (void)styleQuery
|
||||
{
|
||||
CGRect queryRect = CGRectInset(self.mapView.bounds, 100, 200);
|
||||
@@ -828,6 +889,247 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
});
|
||||
}
|
||||
|
||||
- (void)styleFeature
|
||||
{
|
||||
self.mapView.zoomLevel = 10;
|
||||
self.mapView.centerCoordinate = CLLocationCoordinate2DMake(51.068585180672635, -114.06074523925781);
|
||||
|
||||
CLLocationCoordinate2D leafCoords[] = {
|
||||
CLLocationCoordinate2DMake(50.9683733218221,-114.07035827636719),
|
||||
CLLocationCoordinate2DMake(51.02325750523972,-114.06967163085938),
|
||||
CLLocationCoordinate2DMake(51.009434536947786,-114.14245605468749),
|
||||
CLLocationCoordinate2DMake(51.030599281184124,-114.12597656249999),
|
||||
CLLocationCoordinate2DMake(51.060386316691016,-114.21043395996094),
|
||||
CLLocationCoordinate2DMake(51.063838646941576,-114.17816162109375),
|
||||
CLLocationCoordinate2DMake(51.08152779888779,-114.19876098632812),
|
||||
CLLocationCoordinate2DMake(51.08066507029602,-114.16854858398438),
|
||||
CLLocationCoordinate2DMake(51.09662294502995,-114.17472839355469),
|
||||
CLLocationCoordinate2DMake(51.07764539352731,-114.114990234375),
|
||||
CLLocationCoordinate2DMake(51.13670896949613,-114.12391662597656),
|
||||
CLLocationCoordinate2DMake(51.13369295212583,-114.09576416015624),
|
||||
CLLocationCoordinate2DMake(51.17546878815025,-114.07585144042969),
|
||||
CLLocationCoordinate2DMake(51.140155605265896,-114.04632568359375),
|
||||
CLLocationCoordinate2DMake(51.15049396880196,-114.01542663574219),
|
||||
CLLocationCoordinate2DMake(51.088860342359965,-114.00924682617186),
|
||||
CLLocationCoordinate2DMake(51.12205789681453,-113.94813537597656),
|
||||
CLLocationCoordinate2DMake(51.106539930027225,-113.94882202148438),
|
||||
CLLocationCoordinate2DMake(51.117747873223344,-113.92616271972656),
|
||||
CLLocationCoordinate2DMake(51.10093493903458,-113.92616271972656),
|
||||
CLLocationCoordinate2DMake(51.10697105503078,-113.90625),
|
||||
CLLocationCoordinate2DMake(51.09144802136697,-113.9117431640625),
|
||||
CLLocationCoordinate2DMake(51.04916446529361,-113.97010803222655),
|
||||
CLLocationCoordinate2DMake(51.045279344649146,-113.9398956298828),
|
||||
CLLocationCoordinate2DMake(51.022825599852496,-114.06211853027344),
|
||||
CLLocationCoordinate2DMake(51.045279344649146,-113.9398956298828),
|
||||
CLLocationCoordinate2DMake(51.022825599852496,-114.06211853027344),
|
||||
CLLocationCoordinate2DMake(51.022825599852496,-114.06280517578125),
|
||||
CLLocationCoordinate2DMake(50.968805734317804,-114.06280517578125),
|
||||
CLLocationCoordinate2DMake(50.9683733218221,-114.07035827636719),
|
||||
};
|
||||
NSUInteger coordsCount = sizeof(leafCoords) / sizeof(leafCoords[0]);
|
||||
|
||||
MGLPolygonFeature *feature = [MGLPolygonFeature polygonWithCoordinates:leafCoords count:coordsCount];
|
||||
feature.identifier = @"leaf-feature";
|
||||
feature.attributes = @{@"color": @"red"};
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"leaf-source" features:@[feature] options:nil];
|
||||
[self.mapView.style addSource:source];
|
||||
|
||||
MGLFillStyleLayer *layer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"leaf-fill-layer" source:source];
|
||||
layer.predicate = [NSPredicate predicateWithFormat:@"color = %@", @"red"];
|
||||
MGLStyleValue *fillColor = [MGLStyleValue<UIColor *> valueWithRawValue:[UIColor redColor]];
|
||||
layer.fillColor = fillColor;
|
||||
[self.mapView.style addLayer:layer];
|
||||
}
|
||||
|
||||
- (void)updateGeoJSONSourceData
|
||||
{
|
||||
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(40.329795743702064, -107.75390625) zoomLevel:11 animated:NO];
|
||||
|
||||
NSString *geoJSON = @"{\"type\": \"FeatureCollection\",\"features\": [{\"type\": \"Feature\",\"properties\": {},\"geometry\": {\"type\": \"LineString\",\"coordinates\": [[-107.75390625,40.329795743702064],[-104.34814453125,37.64903402157866]]}}]}";
|
||||
|
||||
NSData *data = [geoJSON dataUsingEncoding:NSUTF8StringEncoding];
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"mutable-data-source-id" geoJSONData:data options:nil];
|
||||
[self.mapView.style addSource:source];
|
||||
|
||||
MGLLineStyleLayer *layer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"mutable-data-layer-id" source:source];
|
||||
[self.mapView.style addLayer:layer];
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
NSString *geoJSON = @"{\"type\": \"FeatureCollection\",\"features\": [{\"type\": \"Feature\",\"properties\": {},\"geometry\": {\"type\": \"LineString\",\"coordinates\": [[-107.75390625,40.329795743702064],[-109.34814453125,37.64903402157866]]}}]}";
|
||||
NSData *data = [geoJSON dataUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
source.geoJSONData = data;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)updateGeoJSONSourceURL
|
||||
{
|
||||
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(48.668731, -122.857151) zoomLevel:11 animated:NO];
|
||||
|
||||
NSString *filePath = [[NSBundle bundleForClass:self.class] pathForResource:@"polyline" ofType:@"geojson"];
|
||||
NSURL *geoJSONURL = [NSURL fileURLWithPath:filePath];
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"mutable-data-source-url-id" URL:geoJSONURL options:nil];
|
||||
[self.mapView.style addSource:source];
|
||||
|
||||
MGLLineStyleLayer *layer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"mutable-data-layer-url-id" source:source];
|
||||
[self.mapView.style addLayer:layer];
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(41.563986787078704, -75.04843935793578) zoomLevel:8 animated:NO];
|
||||
|
||||
NSString *filePath = [[NSBundle bundleForClass:self.class] pathForResource:@"threestates" ofType:@"geojson"];
|
||||
NSURL *geoJSONURL = [NSURL fileURLWithPath:filePath];
|
||||
|
||||
source.URL = geoJSONURL;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)updateGeoJSONSourceFeatures
|
||||
{
|
||||
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(-41.1520, 288.6592) zoomLevel:10 animated:NO];
|
||||
|
||||
CLLocationCoordinate2D smallBox[] = {
|
||||
{-41.14763798539186, 288.68019104003906},
|
||||
{-41.140915920129665, 288.68019104003906},
|
||||
{-41.140915920129665, 288.6887741088867},
|
||||
{-41.14763798539186, 288.6887741088867},
|
||||
{-41.14763798539186, 288.68019104003906}
|
||||
};
|
||||
|
||||
CLLocationCoordinate2D largeBox[] = {
|
||||
{-41.17710352162799, 288.67298126220703},
|
||||
{-41.13962313627545, 288.67298126220703},
|
||||
{-41.13962313627545, 288.7261962890625},
|
||||
{-41.17710352162799, 288.7261962890625},
|
||||
{-41.17710352162799, 288.67298126220703}
|
||||
};
|
||||
|
||||
MGLPolygonFeature *smallBoxFeature = [MGLPolygonFeature polygonWithCoordinates:smallBox count:sizeof(smallBox)/sizeof(smallBox[0])];
|
||||
MGLPolygonFeature *largeBoxFeature = [MGLPolygonFeature polygonWithCoordinates:largeBox count:sizeof(largeBox)/sizeof(largeBox[0])];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"mutable-data-source-features-id" features:@[smallBoxFeature] options:nil];
|
||||
[self.mapView.style addSource:source];
|
||||
|
||||
MGLFillStyleLayer *layer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"mutable-data-layer-features-id" source:source];
|
||||
MGLStyleValue *fillColor = [MGLStyleValue<UIColor *> valueWithRawValue:[UIColor redColor]];
|
||||
layer.fillColor = fillColor;
|
||||
[self.mapView.style addLayer:layer];
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
source.features = @[largeBoxFeature];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)styleDynamicPointCollection
|
||||
{
|
||||
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(36.9979, -109.0441) zoomLevel:14 animated:NO];
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
{37.00145594210082, -109.04960632324219},
|
||||
{37.00173012609867, -109.0404224395752},
|
||||
{36.99453246847359, -109.04960632324219},
|
||||
{36.99508088541243, -109.04007911682129},
|
||||
};
|
||||
MGLPointCollectionFeature *feature = [MGLPointCollectionFeature pointCollectionWithCoordinates:coordinates count:4];
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"wiggle-source" features:@[feature] options:nil];
|
||||
[self.mapView.style addSource:source];
|
||||
|
||||
MGLCircleStyleLayer *layer = [[MGLCircleStyleLayer alloc] initWithIdentifier:@"wiggle-layer" source:source];
|
||||
[self.mapView.style addLayer:layer];
|
||||
}
|
||||
|
||||
- (void)styleVectorSource
|
||||
{
|
||||
NSURL *url = [[NSURL alloc] initWithString:@"mapbox://mapbox.mapbox-terrain-v2"];
|
||||
MGLVectorSource *vectorSource = [[MGLVectorSource alloc] initWithIdentifier:@"style-vector-source-id" URL:url];
|
||||
[self.mapView.style addSource:vectorSource];
|
||||
|
||||
MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithIdentifier:@"style-vector-background-layer-id"];
|
||||
backgroundLayer.backgroundColor = [MGLStyleValue<UIColor *> valueWithRawValue:[UIColor blackColor]];
|
||||
[self.mapView.style addLayer:backgroundLayer];
|
||||
|
||||
MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"style-vector-line-layer-id" source:vectorSource];
|
||||
lineLayer.sourceLayerIdentifier = @"contour";
|
||||
NSUInteger lineJoinValue = MGLLineJoinRound;
|
||||
lineLayer.lineJoin = [MGLStyleValue<NSValue *> valueWithRawValue:[NSValue value:&lineJoinValue withObjCType:@encode(MGLLineJoin)]];
|
||||
NSUInteger lineCapValue = MGLLineCapRound;
|
||||
lineLayer.lineCap = [MGLStyleValue<NSValue *> valueWithRawValue:[NSValue value:&lineCapValue withObjCType:@encode(MGLLineCap)]];
|
||||
lineLayer.lineColor = [MGLStyleValue<UIColor *> valueWithRawValue:[UIColor greenColor]];
|
||||
|
||||
[self.mapView.style addLayer:lineLayer];
|
||||
}
|
||||
|
||||
- (void)styleRasterSource
|
||||
{
|
||||
// 3rd party raster source requires NSAppTransportSecurity exception for stamen.com
|
||||
MGLTileSet *rasterTileSet = [[MGLTileSet alloc] initWithTileURLTemplates:@[@"http://a.tile.stamen.com/terrain-background/{z}/{x}/{y}.jpg"]];
|
||||
MGLRasterSource *rasterSource = [[MGLRasterSource alloc] initWithIdentifier:@"style-raster-source-id" tileSet:rasterTileSet tileSize:256];
|
||||
[self.mapView.style addSource:rasterSource];
|
||||
|
||||
MGLRasterStyleLayer *rasterLayer = [[MGLRasterStyleLayer alloc] initWithIdentifier:@"style-raster-layer-id" source:rasterSource];
|
||||
[self.mapView.style addLayer:rasterLayer];
|
||||
}
|
||||
|
||||
-(void)styleCountryLabelsLanguage
|
||||
{
|
||||
NSArray<NSString *> *labelLayers = @[
|
||||
@"country-label-lg",
|
||||
@"country-label-md",
|
||||
@"country-label-sm",
|
||||
];
|
||||
[self styleLabelLanguageForLayersNamed:labelLayers];
|
||||
}
|
||||
|
||||
- (void)styleLabelLanguageForLayersNamed:(NSArray<NSString *> *)layers
|
||||
{
|
||||
_usingLocaleBasedCountryLabels = !_usingLocaleBasedCountryLabels;
|
||||
NSString *bestLanguageForUser = [NSString stringWithFormat:@"{name_%@}", [self bestLanguageForUser]];
|
||||
NSString *language = _usingLocaleBasedCountryLabels ? bestLanguageForUser : @"{name}";
|
||||
|
||||
for (NSString *layerName in layers) {
|
||||
MGLSymbolStyleLayer *layer = (MGLSymbolStyleLayer *)[self.mapView.style layerWithIdentifier:layerName];
|
||||
|
||||
if ([layer isKindOfClass:[MGLSymbolStyleLayer class]]) {
|
||||
if ([layer.textField isKindOfClass:[MGLStyleConstantValue class]]) {
|
||||
MGLStyleConstantValue *label = (MGLStyleConstantValue<NSString *> *)layer.textField;
|
||||
if ([label.rawValue hasPrefix:@"{name"]) {
|
||||
layer.textField = [MGLStyleValue valueWithRawValue:language];
|
||||
}
|
||||
} else if ([layer.textField isKindOfClass:[MGLStyleFunction class]]) {
|
||||
MGLStyleFunction *function = (MGLStyleFunction<NSString *> *)layer.textField;
|
||||
[function.stops enumerateKeysAndObjectsUsingBlock:^(id zoomLevel, id stop, BOOL *done) {
|
||||
if ([stop isKindOfClass:[MGLStyleConstantValue class]]) {
|
||||
MGLStyleConstantValue *label = (MGLStyleConstantValue<NSString *> *)stop;
|
||||
if ([label.rawValue hasPrefix:@"{name"]) {
|
||||
[function.stops setValue:[MGLStyleValue valueWithRawValue:language] forKey:zoomLevel];
|
||||
}
|
||||
}
|
||||
}];
|
||||
layer.textField = function;
|
||||
}
|
||||
} else {
|
||||
NSLog(@"%@ is not a symbol style layer", layerName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *)bestLanguageForUser
|
||||
{
|
||||
NSArray *supportedLanguages = @[ @"en", @"es", @"fr", @"de", @"ru", @"zh" ];
|
||||
NSArray<NSString *> *preferredLanguages = [NSLocale preferredLanguages];
|
||||
NSString *bestLanguage;
|
||||
|
||||
for (NSString *language in preferredLanguages) {
|
||||
NSString *thisLanguage = [NSLocale localeWithLocaleIdentifier:language].languageCode;
|
||||
if ([supportedLanguages containsObject:thisLanguage]) {
|
||||
bestLanguage = thisLanguage;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return bestLanguage ?: @"en";
|
||||
}
|
||||
|
||||
- (IBAction)startWorldTour
|
||||
{
|
||||
_isTouringWorld = YES;
|
||||
@@ -875,6 +1177,20 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
self.mapView.userTrackingMode = MGLUserTrackingModeFollow;
|
||||
}
|
||||
|
||||
- (void)testQueryPointAnnotations {
|
||||
NSNumber *visibleAnnotationCount = @(self.mapView.visibleAnnotations.count);
|
||||
NSString *message;
|
||||
if ([visibleAnnotationCount integerValue] == 1) {
|
||||
message = [NSString stringWithFormat:@"There is %@ visible annotation.", visibleAnnotationCount];
|
||||
} else {
|
||||
message = [NSString stringWithFormat:@"There are %@ visible annotations.", visibleAnnotationCount];
|
||||
}
|
||||
|
||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Visible Annotations" message:message preferredStyle:UIAlertControllerStyleAlert];
|
||||
[alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleCancel handler:nil]];
|
||||
[self presentViewController:alertController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)printTelemetryLogFile
|
||||
{
|
||||
NSString *fileContents = [NSString stringWithContentsOfFile:[self telemetryDebugLogFilePath] encoding:NSUTF8StringEncoding error:nil];
|
||||
@@ -1208,4 +1524,24 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
|
||||
point.coordinate = [self.mapView convertPoint:self.mapView.center toCoordinateFromView:self.mapView];
|
||||
}
|
||||
|
||||
- (void)mapView:(MGLMapView *)mapView didFinishLoadingStyle:(MGLStyle *)style
|
||||
{
|
||||
// Default Mapbox styles use {name_en} as their label language, which means
|
||||
// that a device with an English-language locale is already effectively
|
||||
// using locale-based country labels.
|
||||
_usingLocaleBasedCountryLabels = [[self bestLanguageForUser] isEqualToString:@"en"];
|
||||
}
|
||||
|
||||
- (void)mapViewRegionIsChanging:(MGLMapView *)mapView
|
||||
{
|
||||
if (self.reuseQueueStatsEnabled) {
|
||||
NSUInteger queuedAnnotations = 0;
|
||||
for (NSArray *queue in self.mapView.annotationViewReuseQueueByIdentifier.allValues)
|
||||
{
|
||||
queuedAnnotations += queue.count;
|
||||
}
|
||||
self.hudLabel.text = [NSString stringWithFormat:@"Visible: %ld Queued: %ld", (long)mapView.visibleAnnotations.count, (long)queuedAnnotations];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="PSe-Ot-7Ff">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="PSe-Ot-7Ff">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
|
||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
||||
<capability name="Navigation items with more than one left or right bar item" minToolsVersion="7.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--Map View Controller-->
|
||||
@@ -15,24 +17,35 @@
|
||||
<viewControllerLayoutGuide type="bottom" id="m8o-i7-QIy"/>
|
||||
</layoutGuides>
|
||||
<view key="view" contentMode="scaleToFill" id="Z9X-fc-PUC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="kNe-zV-9ha" customClass="MGLMapView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<gestureRecognizers/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="WaX-pd-UZQ" id="za0-3B-qR6"/>
|
||||
<outletCollection property="gestureRecognizers" destination="lfd-mn-7en" appends="YES" id="0PH-gH-GRm"/>
|
||||
</connections>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" alpha="0.69999999999999996" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="58y-pX-YyB">
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="180" id="OL2-l5-I2f"/>
|
||||
<constraint firstAttribute="height" constant="21" id="xHg-ye-wzT"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="8"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="kNe-zV-9ha" firstAttribute="leading" secondItem="Z9X-fc-PUC" secondAttribute="leading" id="53e-Tz-QxF"/>
|
||||
<constraint firstItem="kNe-zV-9ha" firstAttribute="bottom" secondItem="m8o-i7-QIy" secondAttribute="top" id="Etp-BC-E1N"/>
|
||||
<constraint firstAttribute="trailing" secondItem="kNe-zV-9ha" secondAttribute="trailing" id="MGr-8G-VEb"/>
|
||||
<constraint firstItem="58y-pX-YyB" firstAttribute="trailing" secondItem="Z9X-fc-PUC" secondAttribute="trailingMargin" id="O3a-bR-boI"/>
|
||||
<constraint firstItem="m8o-i7-QIy" firstAttribute="top" secondItem="58y-pX-YyB" secondAttribute="bottom" constant="20" id="cjh-ZS-Mv4"/>
|
||||
<constraint firstItem="kNe-zV-9ha" firstAttribute="top" secondItem="Z9X-fc-PUC" secondAttribute="top" id="qMm-e9-jxH"/>
|
||||
</constraints>
|
||||
</view>
|
||||
@@ -47,7 +60,7 @@
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<button key="titleView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="KsN-ny-Hou">
|
||||
<rect key="frame" x="180" y="7" width="240" height="30"/>
|
||||
<rect key="frame" x="61" y="7" width="207" height="30"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
|
||||
<state key="normal" title="Streets"/>
|
||||
@@ -75,6 +88,7 @@
|
||||
</rightBarButtonItems>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="hudLabel" destination="58y-pX-YyB" id="MEh-ir-3IH"/>
|
||||
<outlet property="mapView" destination="kNe-zV-9ha" id="VNR-WO-1q4"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
@@ -85,60 +99,60 @@
|
||||
</connections>
|
||||
</pongPressGestureRecognizer>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="1366" y="350"/>
|
||||
<point key="canvasLocation" x="1365.5999999999999" y="349.47526236881561"/>
|
||||
</scene>
|
||||
<!--Offline Packs-->
|
||||
<scene sceneID="xIg-PA-7r3">
|
||||
<objects>
|
||||
<tableViewController id="7q0-lI-zqb" customClass="MBXOfflinePacksTableViewController" sceneMemberID="viewController">
|
||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="eeN-6b-zqe">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<prototypes>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Inactive" editingAccessoryType="detailDisclosureButton" textLabel="JtH-Ce-MI5" detailTextLabel="tTJ-jv-U9v" style="IBUITableViewCellStyleSubtitle" id="fGu-Ys-Eh1">
|
||||
<rect key="frame" x="0.0" y="92" width="600" height="44"/>
|
||||
<rect key="frame" x="0.0" y="92" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fGu-Ys-Eh1" id="sUf-bc-8xG">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
|
||||
<frame key="frameInset" width="375" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="My Inactive Offline Pack" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="JtH-Ce-MI5">
|
||||
<rect key="frame" x="15" y="6" width="174.5" height="19.5"/>
|
||||
<frame key="frameInset" minX="15" minY="6" width="174.5" height="19.5"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="456 resources (789 MB)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="tTJ-jv-U9v">
|
||||
<rect key="frame" x="15" y="25.5" width="128" height="13.5"/>
|
||||
<frame key="frameInset" minX="15" minY="25.5" width="128" height="13.5"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
</tableViewCellContentView>
|
||||
</tableViewCell>
|
||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Active" editingAccessoryType="detailDisclosureButton" textLabel="9ZK-gS-wJ4" detailTextLabel="0xK-p8-Mmh" style="IBUITableViewCellStyleSubtitle" id="mKB-tz-Zfl">
|
||||
<rect key="frame" x="0.0" y="136" width="600" height="44"/>
|
||||
<rect key="frame" x="0.0" y="136" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mKB-tz-Zfl" id="nS3-aU-nBr">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
|
||||
<frame key="frameInset" width="375" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="My Active Offline Pack" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9ZK-gS-wJ4">
|
||||
<rect key="frame" x="15" y="6" width="163" height="19.5"/>
|
||||
<frame key="frameInset" minX="15" minY="6" width="163" height="19.5"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Downloading 123 of 456 resources… (789 MB downloaded)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0xK-p8-Mmh">
|
||||
<rect key="frame" x="15" y="25.5" width="310.5" height="13.5"/>
|
||||
<frame key="frameInset" minX="15" minY="25.5" width="310.5" height="13.5"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
@@ -189,5 +203,5 @@
|
||||
<image name="TrackingLocationOffMask.png" width="23" height="23"/>
|
||||
<image name="settings.png" width="28" height="28"/>
|
||||
</resources>
|
||||
<color key="tintColor" red="0.12156862745098039" green="0.5490196078431373" blue="0.6705882352941176" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<color key="tintColor" red="0.12156862745098039" green="0.5490196078431373" blue="0.6705882352941176" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</document>
|
||||
|
||||
@@ -128,6 +128,11 @@
|
||||
4018B1CA1CDC288E00F666AF /* MGLAnnotationView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
4018B1CB1CDC288E00F666AF /* MGLAnnotationView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
404326891D5B9B27007111BD /* MGLAnnotationContainerView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 404326881D5B9B1A007111BD /* MGLAnnotationContainerView_Private.h */; };
|
||||
4049C29D1DB6CD6C00B3F799 /* MGLPointCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
4049C29E1DB6CD6C00B3F799 /* MGLPointCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
4049C29F1DB6CD6C00B3F799 /* MGLPointCollection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4049C29C1DB6CD6C00B3F799 /* MGLPointCollection.mm */; };
|
||||
4049C2A01DB6CD6C00B3F799 /* MGLPointCollection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4049C29C1DB6CD6C00B3F799 /* MGLPointCollection.mm */; };
|
||||
4049C2AC1DB6E05500B3F799 /* MGLPointCollection_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 4049C2AB1DB6E05500B3F799 /* MGLPointCollection_Private.h */; };
|
||||
404C26E21D89B877000AA13D /* MGLTileSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 404C26E01D89B877000AA13D /* MGLTileSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
404C26E31D89B877000AA13D /* MGLTileSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 404C26E01D89B877000AA13D /* MGLTileSet.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
404C26E41D89B877000AA13D /* MGLTileSet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 404C26E11D89B877000AA13D /* MGLTileSet.mm */; };
|
||||
@@ -169,6 +174,7 @@
|
||||
DA1DC99B1CB6E064006E619F /* MBXViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA1DC99A1CB6E064006E619F /* MBXViewController.m */; };
|
||||
DA1DC99D1CB6E076006E619F /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA1DC99C1CB6E076006E619F /* Default-568h@2x.png */; };
|
||||
DA1DC99F1CB6E088006E619F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DA1DC99E1CB6E088006E619F /* Assets.xcassets */; };
|
||||
DA2207BF1DC0805F0002F84D /* MGLStyleValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2207BE1DC0805F0002F84D /* MGLStyleValueTests.swift */; };
|
||||
DA25D5C01CCD9F8400607828 /* Root.plist in Resources */ = {isa = PBXBuildFile; fileRef = DA25D5BF1CCD9F8400607828 /* Root.plist */; };
|
||||
DA25D5C61CCDA06800607828 /* Root.strings in Resources */ = {isa = PBXBuildFile; fileRef = DA25D5C41CCDA06800607828 /* Root.strings */; };
|
||||
DA25D5CD1CCDA11500607828 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DA25D5B91CCD9EDE00607828 /* Settings.bundle */; };
|
||||
@@ -555,14 +561,17 @@
|
||||
4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationView.h; sourceTree = "<group>"; };
|
||||
402E9DE01CD2C76200FD4519 /* Mapbox.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Mapbox.playground; sourceTree = "<group>"; };
|
||||
404326881D5B9B1A007111BD /* MGLAnnotationContainerView_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationContainerView_Private.h; sourceTree = "<group>"; };
|
||||
4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLPointCollection.h; sourceTree = "<group>"; };
|
||||
4049C29C1DB6CD6C00B3F799 /* MGLPointCollection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLPointCollection.mm; sourceTree = "<group>"; };
|
||||
4049C2AB1DB6E05500B3F799 /* MGLPointCollection_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLPointCollection_Private.h; sourceTree = "<group>"; };
|
||||
404C26E01D89B877000AA13D /* MGLTileSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLTileSet.h; sourceTree = "<group>"; };
|
||||
404C26E11D89B877000AA13D /* MGLTileSet.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLTileSet.mm; sourceTree = "<group>"; };
|
||||
404C26E61D89C515000AA13D /* MGLTileSet_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLTileSet_Private.h; sourceTree = "<group>"; };
|
||||
4085AF081D933DEA00F11B22 /* MGLTileSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLTileSetTests.mm; sourceTree = "<group>"; };
|
||||
4085AF081D933DEA00F11B22 /* MGLTileSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLTileSetTests.mm; path = ../../darwin/test/MGLTileSetTests.mm; sourceTree = "<group>"; };
|
||||
408AA8551DAEDA0800022900 /* NSDictionary+MGLAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+MGLAdditions.h"; sourceTree = "<group>"; };
|
||||
408AA8561DAEDA0800022900 /* NSDictionary+MGLAdditions.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSDictionary+MGLAdditions.mm"; sourceTree = "<group>"; };
|
||||
40CF6DBA1DAC3C1800A4D18B /* MGLShape_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLShape_Private.h; sourceTree = "<group>"; };
|
||||
40CFA6501D787579008103BD /* MGLGeoJSONSourceTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLGeoJSONSourceTests.mm; sourceTree = "<group>"; };
|
||||
40CFA6501D787579008103BD /* MGLGeoJSONSourceTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLGeoJSONSourceTests.mm; path = ../../darwin/test/MGLGeoJSONSourceTests.mm; sourceTree = "<group>"; };
|
||||
40EDA1BD1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationContainerView.h; sourceTree = "<group>"; };
|
||||
40EDA1BE1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLAnnotationContainerView.m; sourceTree = "<group>"; };
|
||||
40F8876F1D7A1DB8008ECB67 /* MGLGeoJSONSource_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLGeoJSONSource_Private.h; sourceTree = "<group>"; };
|
||||
@@ -593,6 +602,8 @@
|
||||
DA1DC99A1CB6E064006E619F /* MBXViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBXViewController.m; sourceTree = "<group>"; };
|
||||
DA1DC99C1CB6E076006E619F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
|
||||
DA1DC99E1CB6E088006E619F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
DA2207BD1DC0805F0002F84D /* test-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "test-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
DA2207BE1DC0805F0002F84D /* MGLStyleValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MGLStyleValueTests.swift; path = ../../darwin/test/MGLStyleValueTests.swift; sourceTree = "<group>"; };
|
||||
DA25D5B91CCD9EDE00607828 /* Settings.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Settings.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DA25D5BF1CCD9F8400607828 /* Root.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Root.plist; sourceTree = "<group>"; };
|
||||
DA25D5C51CCDA06800607828 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Root.strings; sourceTree = "<group>"; };
|
||||
@@ -877,9 +888,11 @@
|
||||
357579811D502AD4000B822E /* Styling */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DA2207BD1DC0805F0002F84D /* test-Bridging-Header.h */,
|
||||
3575798F1D513EF1000B822E /* Layers */,
|
||||
35B8E08B1D6C8B5100E768D2 /* MGLFilterTests.mm */,
|
||||
40CFA64E1D78754A008103BD /* Sources */,
|
||||
DA2207BE1DC0805F0002F84D /* MGLStyleValueTests.swift */,
|
||||
);
|
||||
name = Styling;
|
||||
sourceTree = "<group>";
|
||||
@@ -1257,12 +1270,15 @@
|
||||
DA8847E11CBAFA5100AB86E3 /* MGLGeometry.h */,
|
||||
DA8848011CBAFA6200AB86E3 /* MGLGeometry_Private.h */,
|
||||
DA8848021CBAFA6200AB86E3 /* MGLGeometry.mm */,
|
||||
DA8847E31CBAFA5100AB86E3 /* MGLMultiPoint.h */,
|
||||
DA8848041CBAFA6200AB86E3 /* MGLMultiPoint_Private.h */,
|
||||
DA8847E31CBAFA5100AB86E3 /* MGLMultiPoint.h */,
|
||||
DA8848051CBAFA6200AB86E3 /* MGLMultiPoint.mm */,
|
||||
DA8847E71CBAFA5100AB86E3 /* MGLOverlay.h */,
|
||||
DA8847E81CBAFA5100AB86E3 /* MGLPointAnnotation.h */,
|
||||
DA88480B1CBAFA6200AB86E3 /* MGLPointAnnotation.mm */,
|
||||
4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */,
|
||||
4049C2AB1DB6E05500B3F799 /* MGLPointCollection_Private.h */,
|
||||
4049C29C1DB6CD6C00B3F799 /* MGLPointCollection.mm */,
|
||||
DA8847E91CBAFA5100AB86E3 /* MGLPolygon.h */,
|
||||
DA88480C1CBAFA6200AB86E3 /* MGLPolygon.mm */,
|
||||
DA8847EA1CBAFA5100AB86E3 /* MGLPolyline.h */,
|
||||
@@ -1410,6 +1426,7 @@
|
||||
DA8847F01CBAFA5100AB86E3 /* MGLAnnotation.h in Headers */,
|
||||
7E016D841D9E890300A29A21 /* MGLPolygon+MGLAdditions.h in Headers */,
|
||||
400533011DB0862B0069F638 /* NSArray+MGLAdditions.h in Headers */,
|
||||
4049C29D1DB6CD6C00B3F799 /* MGLPointCollection.h in Headers */,
|
||||
DA88483E1CBAFB8500AB86E3 /* MGLMapView+MGLCustomStyleLayerAdditions.h in Headers */,
|
||||
40CF6DBB1DAC3C6600A4D18B /* MGLShape_Private.h in Headers */,
|
||||
4018B1CA1CDC288E00F666AF /* MGLAnnotationView.h in Headers */,
|
||||
@@ -1449,6 +1466,7 @@
|
||||
35136D4C1D4277FC00C20EFD /* MGLSource.h in Headers */,
|
||||
3566C76C1D4A8DFA008152BC /* MGLRasterSource.h in Headers */,
|
||||
DA8847F91CBAFA5100AB86E3 /* MGLPolygon.h in Headers */,
|
||||
4049C2AC1DB6E05500B3F799 /* MGLPointCollection_Private.h in Headers */,
|
||||
DA8847F81CBAFA5100AB86E3 /* MGLPointAnnotation.h in Headers */,
|
||||
353933F21D3FB753003F57D7 /* MGLCircleStyleLayer.h in Headers */,
|
||||
DA8847F31CBAFA5100AB86E3 /* MGLMultiPoint.h in Headers */,
|
||||
@@ -1493,6 +1511,7 @@
|
||||
DABFB85E1CBE99E500D62B32 /* MGLAnnotation.h in Headers */,
|
||||
DABFB8641CBE99E500D62B32 /* MGLOfflineStorage.h in Headers */,
|
||||
DAD165791CF4CDFF001FF4B9 /* MGLShapeCollection.h in Headers */,
|
||||
4049C29E1DB6CD6C00B3F799 /* MGLPointCollection.h in Headers */,
|
||||
3566C7671D4A77BA008152BC /* MGLGeoJSONSource.h in Headers */,
|
||||
DA35A29F1CC9E94C00E826B2 /* MGLCoordinateFormatter.h in Headers */,
|
||||
DABFB8711CBE9A0F00D62B32 /* MGLMapView+MGLCustomStyleLayerAdditions.h in Headers */,
|
||||
@@ -1699,6 +1718,7 @@
|
||||
};
|
||||
DA2E88501CC036F400F24E7B = {
|
||||
CreatedOnToolsVersion = 7.3;
|
||||
LastSwiftMigration = 0800;
|
||||
};
|
||||
DA8847D11CBAF91600AB86E3 = {
|
||||
CreatedOnToolsVersion = 7.3;
|
||||
@@ -1868,6 +1888,7 @@
|
||||
357579851D502AF5000B822E /* MGLSymbolStyleLayerTests.m in Sources */,
|
||||
357579871D502AFE000B822E /* MGLLineStyleLayerTests.m in Sources */,
|
||||
357579891D502B06000B822E /* MGLCircleStyleLayerTests.m in Sources */,
|
||||
DA2207BF1DC0805F0002F84D /* MGLStyleValueTests.swift in Sources */,
|
||||
40CFA6511D7875BB008103BD /* MGLGeoJSONSourceTests.mm in Sources */,
|
||||
DA35A2C51CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m in Sources */,
|
||||
35B8E08C1D6C8B5100E768D2 /* MGLFilterTests.mm in Sources */,
|
||||
@@ -1943,6 +1964,7 @@
|
||||
35D13AC51D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm in Sources */,
|
||||
DA8848241CBAFA6200AB86E3 /* MGLOfflineStorage.mm in Sources */,
|
||||
DA88482A1CBAFA6200AB86E3 /* MGLTilePyramidOfflineRegion.mm in Sources */,
|
||||
4049C29F1DB6CD6C00B3F799 /* MGLPointCollection.mm in Sources */,
|
||||
35136D3F1D42273000C20EFD /* MGLLineStyleLayer.mm in Sources */,
|
||||
DA88481A1CBAFA6200AB86E3 /* MGLAccountManager.m in Sources */,
|
||||
3510FFFB1D6DCC4700F413B2 /* NSCompoundPredicate+MGLAdditions.mm in Sources */,
|
||||
@@ -2014,6 +2036,7 @@
|
||||
35D13AC61D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm in Sources */,
|
||||
DAA4E42A1CBB730400178DFB /* NSProcessInfo+MGLAdditions.m in Sources */,
|
||||
DAA4E4211CBB730400178DFB /* MGLOfflineStorage.mm in Sources */,
|
||||
4049C2A01DB6CD6C00B3F799 /* MGLPointCollection.mm in Sources */,
|
||||
35136D401D42273000C20EFD /* MGLLineStyleLayer.mm in Sources */,
|
||||
DAA4E42F1CBB730400178DFB /* MGLCompactCalloutView.m in Sources */,
|
||||
3510FFFC1D6DCC4700F413B2 /* NSCompoundPredicate+MGLAdditions.mm in Sources */,
|
||||
@@ -2264,6 +2287,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)";
|
||||
INFOPLIST_FILE = test/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
@@ -2276,6 +2300,9 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.test;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "test/test-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -2283,6 +2310,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 55D8C9941D0F133500F42F10 /* config.xcconfig */;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)";
|
||||
INFOPLIST_FILE = test/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
@@ -2295,6 +2323,8 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.test;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "test/test-Bridging-Header.h";
|
||||
SWIFT_VERSION = 3.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
||||
@@ -34,6 +34,7 @@ custom_categories:
|
||||
- MGLMultiPolygon
|
||||
- MGLMultiPolyline
|
||||
- MGLPointAnnotation
|
||||
- MGLPointCollection
|
||||
- MGLPolygon
|
||||
- MGLPolyline
|
||||
- MGLOverlay
|
||||
@@ -44,9 +45,9 @@ custom_categories:
|
||||
- name: Map Data
|
||||
children:
|
||||
- MGLFeature
|
||||
- MGLMultiPointFeature
|
||||
- MGLMultiPolygonFeature
|
||||
- MGLMultiPolylineFeature
|
||||
- MGLPointCollectionFeature
|
||||
- MGLPointFeature
|
||||
- MGLPolygonFeature
|
||||
- MGLPolylineFeature
|
||||
|
||||
@@ -43,7 +43,7 @@ buildPackageStyle() {
|
||||
github-release upload \
|
||||
--tag "ios-v${PUBLISH_VERSION}" \
|
||||
--name ${file_name} \
|
||||
--file "${BINARY_DIRECTORY}/${file_name}"
|
||||
--file "${BINARY_DIRECTORY}/${file_name}" > /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -58,9 +58,6 @@ BINARY_DIRECTORY=${BINARY_DIRECTORY:-build/ios/deploy}
|
||||
GITHUB_RELEASE=${GITHUB_RELEASE:-true}
|
||||
PUBLISH_PRE_FLAG=''
|
||||
|
||||
rm -rf ${BINARY_DIRECTORY}
|
||||
mkdir -p ${BINARY_DIRECTORY}
|
||||
|
||||
if [[ ${GITHUB_RELEASE} = "true" ]]; then
|
||||
GITHUB_RELEASE=true # Assign bool, not just a string
|
||||
|
||||
@@ -98,6 +95,7 @@ git checkout ${VERSION_TAG}
|
||||
step "Deploying version ${PUBLISH_VERSION}…"
|
||||
|
||||
make clean && make distclean
|
||||
mkdir -p ${BINARY_DIRECTORY}
|
||||
|
||||
if [[ "${GITHUB_RELEASE}" == true ]]; then
|
||||
step "Create GitHub release…"
|
||||
@@ -116,4 +114,4 @@ buildPackageStyle "iframework" "symbols-dynamic"
|
||||
buildPackageStyle "iframework SYMBOLS=NO" "dynamic"
|
||||
buildPackageStyle "ifabric" "fabric"
|
||||
|
||||
step "Finished deploying ${PUBLISH_VERSION}"
|
||||
step "Finished deploying ${PUBLISH_VERSION} in $(($SECONDS / 60)) minutes and $(($SECONDS % 60)) seconds"
|
||||
|
||||
@@ -892,14 +892,23 @@ IB_DESIGNABLE
|
||||
*/
|
||||
@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *annotations;
|
||||
|
||||
/**
|
||||
The complete list of annotations associated with the receiver that are
|
||||
currently visible.
|
||||
|
||||
The objects in this array must adopt the `MGLAnnotation` protocol. If no
|
||||
annotations are associated with the map view or if no annotations associated
|
||||
with the map view are currently visible, the value of this property is `nil`.
|
||||
*/
|
||||
@property (nonatomic, readonly, nullable) NS_ARRAY_OF(id <MGLAnnotation>) *visibleAnnotations;
|
||||
|
||||
/**
|
||||
Adds an annotation to the map view.
|
||||
|
||||
@note `MGLMultiPolyline`, `MGLMultiPolygon`, and `MGLShapeCollection` objects
|
||||
cannot be added to the map view at this time. Nor can `MGLMultiPoint`
|
||||
objects that are not instances of `MGLPolyline` or `MGLPolygon`. Any
|
||||
multipoint, multipolyline, multipolygon, or shape collection object that is
|
||||
specified is silently ignored.
|
||||
@note `MGLMultiPolyline`, `MGLMultiPolygon`, `MGLShapeCollection`, and
|
||||
`MGLPointCollection` objects cannot be added to the map view at this time.
|
||||
Any multipoint, multipolyline, multipolygon, shape or point collection
|
||||
object that is specified is silently ignored.
|
||||
|
||||
@param annotation The annotation object to add to the receiver. This object
|
||||
must conform to the `MGLAnnotation` protocol. The map view retains the
|
||||
@@ -987,6 +996,17 @@ IB_DESIGNABLE
|
||||
*/
|
||||
- (nullable __kindof MGLAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;
|
||||
|
||||
/**
|
||||
Returns the list of annotations associated with the receiver that intersect with
|
||||
the given rectangle.
|
||||
|
||||
@param rect A rectangle expressed in the map view’s coordinate system.
|
||||
@return An array of objects that adopt the `MGLAnnotation` protocol or `nil` if
|
||||
no annotations associated with the map view are currently visible in the
|
||||
rectangle.
|
||||
*/
|
||||
- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect;
|
||||
|
||||
#pragma mark Managing Annotation Selections
|
||||
|
||||
/**
|
||||
|
||||
@@ -129,7 +129,10 @@ enum { MGLAnnotationTagNotFound = UINT32_MAX };
|
||||
|
||||
/// Mapping from an annotation tag to metadata about that annotation, including
|
||||
/// the annotation itself.
|
||||
typedef std::map<MGLAnnotationTag, MGLAnnotationContext> MGLAnnotationContextMap;
|
||||
typedef std::unordered_map<MGLAnnotationTag, MGLAnnotationContext> MGLAnnotationTagContextMap;
|
||||
|
||||
/// Mapping from an annotation object to an annotation tag.
|
||||
typedef std::map<id<MGLAnnotation>, MGLAnnotationTag> MGLAnnotationObjectTagMap;
|
||||
|
||||
/// Initializes the run loop shim that lives on the main thread.
|
||||
void MGLinitializeRunLoop() {
|
||||
@@ -254,6 +257,7 @@ public:
|
||||
@property (nonatomic) MGLMapViewProxyAccessibilityElement *mapViewProxyAccessibilityElement;
|
||||
@property (nonatomic) MGLAnnotationContainerView *annotationContainerView;
|
||||
@property (nonatomic) MGLUserLocation *userLocation;
|
||||
@property (nonatomic) NS_MUTABLE_DICTIONARY_OF(NSString *, NS_MUTABLE_ARRAY_OF(MGLAnnotationView *) *) *annotationViewReuseQueueByIdentifier;
|
||||
|
||||
@end
|
||||
|
||||
@@ -267,10 +271,11 @@ public:
|
||||
|
||||
NS_MUTABLE_ARRAY_OF(NSURL *) *_bundledStyleURLs;
|
||||
|
||||
MGLAnnotationContextMap _annotationContextsByAnnotationTag;
|
||||
MGLAnnotationTagContextMap _annotationContextsByAnnotationTag;
|
||||
MGLAnnotationObjectTagMap _annotationTagsByAnnotation;
|
||||
|
||||
/// Tag of the selected annotation. If the user location annotation is selected, this ivar is set to `MGLAnnotationTagNotFound`.
|
||||
MGLAnnotationTag _selectedAnnotationTag;
|
||||
NS_MUTABLE_DICTIONARY_OF(NSString *, NS_MUTABLE_ARRAY_OF(MGLAnnotationView *) *) *_annotationViewReuseQueueByIdentifier;
|
||||
|
||||
BOOL _userLocationAnnotationIsSelected;
|
||||
/// Size of the rectangle formed by unioning the maximum slop area around every annotation image and annotation image view.
|
||||
@@ -426,6 +431,7 @@ public:
|
||||
// Set up annotation management and selection state.
|
||||
_annotationImagesByIdentifier = [NSMutableDictionary dictionary];
|
||||
_annotationContextsByAnnotationTag = {};
|
||||
_annotationTagsByAnnotation = {};
|
||||
_annotationViewReuseQueueByIdentifier = [NSMutableDictionary dictionary];
|
||||
_selectedAnnotationTag = MGLAnnotationTagNotFound;
|
||||
_annotationsNearbyLastTap = {};
|
||||
@@ -2819,6 +2825,35 @@ public:
|
||||
return [NSArray arrayWithObjects:&annotations[0] count:annotations.size()];
|
||||
}
|
||||
|
||||
- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotations
|
||||
{
|
||||
return [self visibleAnnotationsInRect:self.bounds];
|
||||
}
|
||||
|
||||
- (nullable NS_ARRAY_OF(id <MGLAnnotation>) *)visibleAnnotationsInRect:(CGRect)rect
|
||||
{
|
||||
if (_annotationContextsByAnnotationTag.empty())
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
std::vector<MGLAnnotationTag> annotationTags = [self annotationTagsInRect:rect];
|
||||
if (annotationTags.size())
|
||||
{
|
||||
NSMutableArray *annotations = [NSMutableArray arrayWithCapacity:annotationTags.size()];
|
||||
|
||||
for (auto const& annotationTag: annotationTags)
|
||||
{
|
||||
MGLAnnotationContext annotationContext = _annotationContextsByAnnotationTag[annotationTag];
|
||||
[annotations addObject:annotationContext.annotation];
|
||||
}
|
||||
|
||||
return [annotations copy];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
/// Returns the annotation assigned the given tag. Cheap.
|
||||
- (id <MGLAnnotation>)annotationWithTag:(MGLAnnotationTag)tag
|
||||
{
|
||||
@@ -2878,13 +2913,6 @@ public:
|
||||
|
||||
if ([annotation isKindOfClass:[MGLMultiPoint class]])
|
||||
{
|
||||
// Actual multipoints aren’t supported as annotations.
|
||||
if ([annotation isMemberOfClass:[MGLMultiPoint class]]
|
||||
|| [annotation isMemberOfClass:[MGLMultiPointFeature class]])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// The polyline or polygon knows how to style itself (with the map view’s help).
|
||||
MGLMultiPoint *multiPoint = (MGLMultiPoint *)annotation;
|
||||
if (!multiPoint.pointCount) {
|
||||
@@ -2899,8 +2927,9 @@ public:
|
||||
[(NSObject *)annotation addObserver:self forKeyPath:@"coordinates" options:0 context:(void *)(NSUInteger)annotationTag];
|
||||
}
|
||||
else if ( ! [annotation isKindOfClass:[MGLMultiPolyline class]]
|
||||
|| ![annotation isKindOfClass:[MGLMultiPolygon class]]
|
||||
|| ![annotation isKindOfClass:[MGLShapeCollection class]])
|
||||
&& ![annotation isKindOfClass:[MGLMultiPolygon class]]
|
||||
&& ![annotation isKindOfClass:[MGLShapeCollection class]]
|
||||
&& ![annotation isKindOfClass:[MGLPointCollection class]])
|
||||
{
|
||||
MGLAnnotationView *annotationView;
|
||||
NSString *symbolName;
|
||||
@@ -2972,6 +3001,7 @@ public:
|
||||
context.viewReuseIdentifier = annotationView.reuseIdentifier;
|
||||
}
|
||||
|
||||
_annotationTagsByAnnotation[annotation] = annotationTag;
|
||||
_annotationContextsByAnnotationTag[annotationTag] = context;
|
||||
|
||||
if ([annotation isKindOfClass:[NSObject class]]) {
|
||||
@@ -3068,9 +3098,7 @@ public:
|
||||
|
||||
- (nullable MGLAnnotationView *)viewForAnnotation:(id<MGLAnnotation>)annotation
|
||||
{
|
||||
MGLAnnotationTag annotationTag = [self annotationTagForAnnotation:annotation];
|
||||
if (annotationTag == MGLAnnotationTagNotFound) return nil;
|
||||
|
||||
MGLAnnotationTag annotationTag = _annotationTagsByAnnotation.at(annotation);
|
||||
MGLAnnotationContext &annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
return annotationContext.annotationView;
|
||||
}
|
||||
@@ -3171,6 +3199,16 @@ public:
|
||||
|
||||
MGLAnnotationContext &annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
MGLAnnotationView *annotationView = annotationContext.annotationView;
|
||||
|
||||
if (annotationContext.viewReuseIdentifier)
|
||||
{
|
||||
NSMutableArray *annotationViewReuseQueue = [self annotationViewReuseQueueForIdentifier:annotationContext.viewReuseIdentifier];
|
||||
if (![annotationViewReuseQueue containsObject:annotationView])
|
||||
{
|
||||
[annotationViewReuseQueue removeObject:annotationView];
|
||||
}
|
||||
}
|
||||
|
||||
annotationView.annotation = nil;
|
||||
[annotationView removeFromSuperview];
|
||||
|
||||
@@ -3180,6 +3218,7 @@ public:
|
||||
}
|
||||
|
||||
_annotationContextsByAnnotationTag.erase(annotationTag);
|
||||
_annotationTagsByAnnotation.erase(annotation);
|
||||
|
||||
if ([annotation isKindOfClass:[NSObject class]] && ![annotation isKindOfClass:[MGLMultiPoint class]])
|
||||
{
|
||||
@@ -4614,51 +4653,91 @@ public:
|
||||
[CATransaction begin];
|
||||
[CATransaction setDisableActions:YES];
|
||||
|
||||
for (auto &pair : _annotationContextsByAnnotationTag)
|
||||
// If the map is pitched consider the viewport to be exactly the same as the bounds.
|
||||
// Otherwise, add a small buffer.
|
||||
CGFloat widthAdjustment = self.camera.pitch > 0.0 ? 0.0 : -_largestAnnotationViewSize.width * 2.0;
|
||||
CGFloat heightAdjustment = self.camera.pitch > 0.0 ? 0.0 : -_largestAnnotationViewSize.height * 2.0;
|
||||
CGRect viewPort = CGRectInset(self.bounds, widthAdjustment, heightAdjustment);
|
||||
|
||||
NSArray *visibleAnnotations = [self visibleAnnotationsInRect:viewPort];
|
||||
NSMutableArray *offscreenAnnotations = [self.annotations mutableCopy];
|
||||
[offscreenAnnotations removeObjectsInArray:visibleAnnotations];
|
||||
|
||||
// Update the center of visible annotation views
|
||||
for (id<MGLAnnotation> annotation in visibleAnnotations)
|
||||
{
|
||||
CGRect viewPort = CGRectInset(self.bounds,
|
||||
-_largestAnnotationViewSize.width / 2.0 - MGLAnnotationUpdateViewportOutset.width / 2.0,
|
||||
-_largestAnnotationViewSize.height / 2.0 - MGLAnnotationUpdateViewportOutset.width);
|
||||
|
||||
MGLAnnotationContext &annotationContext = pair.second;
|
||||
MGLAnnotationView *annotationView = annotationContext.annotationView;
|
||||
|
||||
// Defer to the shape/polygon styling delegate methods
|
||||
if ([annotationContext.annotation isKindOfClass:[MGLMultiPoint class]])
|
||||
if ([annotation isKindOfClass:[MGLMultiPoint class]])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the annotation tag then use it to get the context. This avoids the expensive lookup
|
||||
// by tag in `annotationTagForAnnotation:`
|
||||
MGLAnnotationTag annotationTag = _annotationTagsByAnnotation.at(annotation);
|
||||
MGLAnnotationContext &annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
|
||||
MGLAnnotationView *annotationView = annotationContext.annotationView;
|
||||
if (!annotationView)
|
||||
{
|
||||
// This will dequeue views if the delegate implements the dequeue call
|
||||
MGLAnnotationView *annotationView = [self annotationViewForAnnotation:annotationContext.annotation];
|
||||
|
||||
if (annotationView)
|
||||
{
|
||||
annotationView.mapView = self;
|
||||
annotationView.center = [self convertCoordinate:annotationContext.annotation.coordinate toPointToView:self];
|
||||
annotationContext.annotationView = annotationView;
|
||||
|
||||
// New annotation (created because there is nothing to dequeue) may not have been added to the
|
||||
// container view yet. Add them here.
|
||||
if (!annotationView.superview) {
|
||||
[self.annotationContainerView insertSubview:annotationView atIndex:0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// if there is no annotationView at this point then we are dealing with a sprite backed annotation
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
bool annotationViewIsVisible = CGRectContainsRect(viewPort, annotationView.frame);
|
||||
if (!annotationViewIsVisible && annotationContext.viewReuseIdentifier)
|
||||
{
|
||||
[self enqueueAnnotationViewForAnnotationContext:annotationContext];
|
||||
}
|
||||
else
|
||||
if (annotationView)
|
||||
{
|
||||
annotationView.center = [self convertCoordinate:annotationContext.annotation.coordinate toPointToView:self];
|
||||
}
|
||||
}
|
||||
|
||||
CGPoint upperLeft = {_largestAnnotationViewSize.width,_largestAnnotationViewSize.height};
|
||||
CGPoint lowerRight = {CGRectGetWidth(self.bounds) + _largestAnnotationViewSize.width,
|
||||
CGRectGetHeight(self.bounds) + _largestAnnotationViewSize.height};
|
||||
|
||||
CLLocationCoordinate2D upperLeftCoordinate = [self convertPoint:upperLeft toCoordinateFromView:self];
|
||||
CLLocationCoordinate2D lowerRightCoordinate = [self convertPoint:lowerRight toCoordinateFromView:self];
|
||||
|
||||
// Enqueue (and move if required) offscreen annotation views
|
||||
for (id<MGLAnnotation> annotation in offscreenAnnotations)
|
||||
{
|
||||
CLLocationCoordinate2D coordinate = annotation.coordinate;
|
||||
MGLAnnotationTag annotationTag = _annotationTagsByAnnotation.at(annotation);
|
||||
MGLAnnotationContext &annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
UIView *annotationView = annotationContext.annotationView;
|
||||
|
||||
if (annotationView)
|
||||
{
|
||||
// Every so often (1 out of 1000 frames?) the mbgl query mechanism fails. This logic spot checks the
|
||||
// offscreenAnnotations values -- if they are actually still on screen then the view center is
|
||||
// moved and the enqueue operation is avoided. This allows us to keep the performance benefit of
|
||||
// using the mbgl query result. It also forces views that have just gone offscreen to be cleared
|
||||
// fully from view.
|
||||
if ((coordinate.latitude > upperLeftCoordinate.latitude || coordinate.latitude < lowerRightCoordinate.latitude) ||
|
||||
(coordinate.longitude < upperLeftCoordinate.longitude || coordinate.longitude > lowerRightCoordinate.longitude))
|
||||
{
|
||||
CGRect adjustedFrame = annotationView.frame;
|
||||
adjustedFrame.origin.x = -CGRectGetWidth(adjustedFrame) * 2.0;
|
||||
annotationView.frame = adjustedFrame;
|
||||
[self enqueueAnnotationViewForAnnotationContext:annotationContext];
|
||||
}
|
||||
else
|
||||
{
|
||||
annotationView.center = [self convertCoordinate:annotationContext.annotation.coordinate toPointToView:self];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[CATransaction commit];
|
||||
}
|
||||
@@ -4669,10 +4748,9 @@ public:
|
||||
|
||||
if (!annotationView) return;
|
||||
|
||||
annotationView.annotation = nil;
|
||||
|
||||
if (annotationContext.viewReuseIdentifier)
|
||||
{
|
||||
annotationView.annotation = nil;
|
||||
NSMutableArray *annotationViewReuseQueue = [self annotationViewReuseQueueForIdentifier:annotationContext.viewReuseIdentifier];
|
||||
if (![annotationViewReuseQueue containsObject:annotationView])
|
||||
{
|
||||
|
||||
@@ -27,6 +27,7 @@ FOUNDATION_EXPORT const unsigned char MapboxVersionString[];
|
||||
#import "MGLOfflineStorage.h"
|
||||
#import "MGLOverlay.h"
|
||||
#import "MGLPointAnnotation.h"
|
||||
#import "MGLPointCollection.h"
|
||||
#import "MGLPolygon.h"
|
||||
#import "MGLPolyline.h"
|
||||
#import "MGLShape.h"
|
||||
|
||||
@@ -1,297 +0,0 @@
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import <Mapbox/Mapbox.h>
|
||||
#import "MGLFeature_Private.h"
|
||||
#import "MGLGeoJSONSource_Private.h"
|
||||
#import "MGLSource_Private.h"
|
||||
|
||||
#include <mbgl/style/sources/geojson_source.hpp>
|
||||
|
||||
@interface MGLGeoJSONSourceTests : XCTestCase
|
||||
@end
|
||||
|
||||
@interface MGLPolygonFeature (Test)
|
||||
|
||||
@property (nonatomic, copy, readwrite) NS_DICTIONARY_OF(NSString *, id) *attributes;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MGLGeoJSONSourceTests
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithOptions {
|
||||
NSURL *url = [NSURL URLWithString:@"http://www.mapbox.com/source"];
|
||||
|
||||
NSDictionary *options = @{MGLGeoJSONClusterOption: @(YES),
|
||||
MGLGeoJSONClusterRadiusOption: @42,
|
||||
MGLGeoJSONClusterMaximumZoomLevelOption: @98,
|
||||
MGLGeoJSONMaximumZoomLevelOption: @99,
|
||||
MGLGeoJSONBufferOption: @1976,
|
||||
MGLGeoJSONToleranceOption: @0.42};
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" URL:url options:options];
|
||||
|
||||
auto mbglOptions = [source geoJSONOptions];
|
||||
XCTAssertTrue(mbglOptions.cluster);
|
||||
XCTAssertEqual(mbglOptions.clusterRadius, 42);
|
||||
XCTAssertEqual(mbglOptions.clusterMaxZoom, 98);
|
||||
XCTAssertEqual(mbglOptions.maxzoom, 99);
|
||||
XCTAssertEqual(mbglOptions.buffer, 1976);
|
||||
XCTAssertEqual(mbglOptions.tolerance, 0.42);
|
||||
|
||||
options = @{MGLGeoJSONClusterOption: @"number 1"};
|
||||
source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" URL:url options:options];
|
||||
XCTAssertThrows([source geoJSONOptions]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithData {
|
||||
|
||||
NSString *geoJSON = @"{\"type\": \"FeatureCollection\",\"features\": [{\"type\": \"Feature\",\"properties\": {},\"geometry\": {\"type\": \"LineString\",\"coordinates\": [[-107.75390625,40.329795743702064],[-104.34814453125,37.64903402157866]]}}]}";
|
||||
|
||||
NSData *data = [geoJSON dataUsingEncoding:NSUTF8StringEncoding];
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" geoJSONData:data options:nil];
|
||||
|
||||
[source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLPolylineFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithPolylineFeatures {
|
||||
CLLocationCoordinate2D coordinates[] = { CLLocationCoordinate2DMake(0, 0), CLLocationCoordinate2DMake(10, 10)};
|
||||
MGLPolylineFeature *polylineFeature = [MGLPolylineFeature polylineWithCoordinates:coordinates count:2];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[polylineFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLPolylineFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithPolygonFeatures {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
MGLPolygonFeature<MGLFeaturePrivate> *polygonFeature = (MGLPolygonFeature<MGLFeaturePrivate> *)[MGLPolygonFeature polygonWithCoordinates:coordinates count:5];
|
||||
polygonFeature.identifier = @"feature-id";
|
||||
NSString *stringAttribute = @"string";
|
||||
NSNumber *boolAttribute = [NSNumber numberWithBool:YES];
|
||||
NSNumber *doubleAttribute = [NSNumber numberWithDouble:1.23];
|
||||
NSDictionary *nestedDictionaryValue = @{@"nested-key-1": @"nested-string-value"};
|
||||
NSArray *arrayValue = @[@"string-value", @2];
|
||||
NSDictionary *dictionaryValue = @{@"key-1": @"string-value",
|
||||
@"key-2": @1,
|
||||
@"key-3": nestedDictionaryValue,
|
||||
@"key-4": arrayValue};
|
||||
NSArray *arrayOfArrays = @[@[@1, @"string-value", @[@"jagged"]]];
|
||||
NSArray *arrayOfDictionaries = @[@{@"key": @"value"}];
|
||||
|
||||
polygonFeature.attributes = @{@"name": stringAttribute,
|
||||
@"bool": boolAttribute,
|
||||
@"double": doubleAttribute,
|
||||
@"dictionary-attribute": dictionaryValue,
|
||||
@"array-attribute": arrayValue,
|
||||
@"array-of-array-attribute": arrayOfArrays,
|
||||
@"array-of-dictionary-attribute": arrayOfDictionaries};
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[polygonFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
MGLPolygonFeature *expectedPolygonFeature = (MGLPolygonFeature *)source.features.firstObject;
|
||||
XCTAssertTrue([expectedPolygonFeature isMemberOfClass:[MGLPolygonFeature class]]);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.identifier, polygonFeature.identifier);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"name"], stringAttribute);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"bool"], boolAttribute);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"double"], doubleAttribute);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"dictionary-attribute"], dictionaryValue);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"array-attribute"], arrayValue);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"array-of-array-attribute"], arrayOfArrays);
|
||||
XCTAssertEqualObjects(expectedPolygonFeature.attributes[@"array-of-dictionary-attribute"], arrayOfDictionaries);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithPolygonFeaturesInculdingInteriorPolygons {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
CLLocationCoordinate2D interiorCoordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.2, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.2)};
|
||||
|
||||
MGLPolygon *polygon = [MGLPolygon polygonWithCoordinates:interiorCoordinates count:5];
|
||||
|
||||
MGLPolygonFeature *polygonFeature = [MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[polygonFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLPolygonFeature class]]);
|
||||
}
|
||||
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithMultiPointFeaturesUsingPolylines {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
MGLMultiPointFeature *multiPointFeature = [MGLMultiPointFeature multiPointWithCoordinates:coordinates count:5];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[multiPointFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLMultiPointFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithMultiPointFeaturesUsingPolygons {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
CLLocationCoordinate2D interiorCoordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.2, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.2)};
|
||||
|
||||
MGLPolygon *polygon = [MGLPolygon polygonWithCoordinates:interiorCoordinates count:5];
|
||||
|
||||
MGLMultiPointFeature *multiPointFeature = (MGLMultiPointFeature *)[MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[multiPointFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLPolygonFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithMultiPolylineFeatures {
|
||||
CLLocationCoordinate2D firstCoordinates[] = { CLLocationCoordinate2DMake(0, 0), CLLocationCoordinate2DMake(10, 10)};
|
||||
MGLPolylineFeature *firstPolylineFeature = [MGLPolylineFeature polylineWithCoordinates:firstCoordinates count:2];
|
||||
CLLocationCoordinate2D secondCoordinates[] = { CLLocationCoordinate2DMake(0, 0), CLLocationCoordinate2DMake(10, 10)};
|
||||
MGLPolylineFeature *secondPolylineFeature = [MGLPolylineFeature polylineWithCoordinates:secondCoordinates count:2];
|
||||
MGLMultiPolylineFeature *multiPolylineFeature = [MGLMultiPolylineFeature multiPolylineWithPolylines:@[firstPolylineFeature, secondPolylineFeature]];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[multiPolylineFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLMultiPolylineFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithMultiPolygonFeatures {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
CLLocationCoordinate2D interiorCoordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.2, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.2)};
|
||||
|
||||
MGLPolygon *polygon = [MGLPolygon polygonWithCoordinates:interiorCoordinates count:5];
|
||||
|
||||
MGLPolygonFeature *firstPolygon = [MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
MGLPolygonFeature *secondPolygon = [MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
|
||||
MGLMultiPolygonFeature *multiPolygonFeature = [MGLMultiPolygonFeature multiPolygonWithPolygons:@[firstPolygon, secondPolygon]];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"source-id" features:@[multiPolygonFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLMultiPolygonFeature class]]);
|
||||
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithPointFeature {
|
||||
MGLPointFeature *pointFeature = [MGLPointFeature new];
|
||||
pointFeature.coordinate = CLLocationCoordinate2DMake(100.2, 0.2);
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"souce-id" features:@[pointFeature] options:nil];
|
||||
|
||||
std::unique_ptr<mbgl::style::Source> mbglSource = [source mbglSource];
|
||||
|
||||
XCTAssertNotNil(source.features);
|
||||
XCTAssertEqual(source.features.count, 1);
|
||||
XCTAssertTrue([source.features.firstObject isMemberOfClass:[MGLPointFeature class]]);
|
||||
}
|
||||
|
||||
- (void)testMGLGeoJSONSourceWithShapeCollectionFeatures {
|
||||
CLLocationCoordinate2D coordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 0.0),
|
||||
CLLocationCoordinate2DMake(101.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 1.0),
|
||||
CLLocationCoordinate2DMake(100.0, 0.0)};
|
||||
|
||||
CLLocationCoordinate2D interiorCoordinates[] = {
|
||||
CLLocationCoordinate2DMake(100.2, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.2),
|
||||
CLLocationCoordinate2DMake(100.8, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.8),
|
||||
CLLocationCoordinate2DMake(100.2, 0.2)};
|
||||
|
||||
MGLPolygon *polygon = [MGLPolygon polygonWithCoordinates:interiorCoordinates count:5];
|
||||
|
||||
MGLPolygonFeature *polygonFeature = [MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
|
||||
CLLocationCoordinate2D coordinates_2[] = { CLLocationCoordinate2DMake(0, 0), CLLocationCoordinate2DMake(10, 10)};
|
||||
MGLPolylineFeature *polylineFeature = [MGLPolylineFeature polylineWithCoordinates:coordinates_2 count:2];
|
||||
|
||||
MGLMultiPolygonFeature *multiPolygonFeature = [MGLMultiPolygonFeature multiPolygonWithPolygons:@[polygonFeature, polygonFeature]];
|
||||
|
||||
MGLMultiPolylineFeature *multiPolylineFeature = [MGLMultiPolylineFeature multiPolylineWithPolylines:@[polylineFeature, polylineFeature]];
|
||||
|
||||
MGLMultiPointFeature *multiPointFeature = (MGLMultiPointFeature *)[MGLPolygonFeature polygonWithCoordinates:coordinates count:5 interiorPolygons:@[polygon]];
|
||||
|
||||
MGLPointFeature *pointFeature = [MGLPointFeature new];
|
||||
pointFeature.coordinate = CLLocationCoordinate2DMake(100.2, 0.2);
|
||||
|
||||
MGLShapeCollectionFeature *shapeCollectionFeature = [MGLShapeCollectionFeature shapeCollectionWithShapes:@[polygonFeature, polylineFeature, multiPolygonFeature, multiPolylineFeature, multiPointFeature, pointFeature]];
|
||||
|
||||
MGLShapeCollectionFeature *shapeCollectionFeature_1 = [MGLShapeCollectionFeature shapeCollectionWithShapes:@[polygonFeature, polylineFeature, multiPolygonFeature, multiPolylineFeature, multiPointFeature, pointFeature, shapeCollectionFeature]];
|
||||
|
||||
MGLGeoJSONSource *source = [[MGLGeoJSONSource alloc] initWithIdentifier:@"" features:@[shapeCollectionFeature_1] options:nil];
|
||||
|
||||
XCTAssertThrowsSpecificNamed([source mbglSource], NSException, @"Method unavailable");
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,82 +0,0 @@
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import <Mapbox/Mapbox.h>
|
||||
#import "MGLTileSet_Private.h"
|
||||
|
||||
#include <mbgl/util/tileset.hpp>
|
||||
|
||||
@interface MGLTileSetTests : XCTestCase
|
||||
|
||||
@end
|
||||
|
||||
@implementation MGLTileSetTests
|
||||
|
||||
- (void)testTileSet {
|
||||
// a tile set that provides an mbgl tile set
|
||||
MGLTileSet *tileSet = [[MGLTileSet alloc] initWithTileURLTemplates:@[@"tile.1",
|
||||
@"tile.2",
|
||||
@"tile.3"]];
|
||||
mbgl::Tileset mbglTileset = [tileSet mbglTileset];
|
||||
|
||||
// has the correct URL templates
|
||||
XCTAssertEqual(mbglTileset.tiles.size(), 3);
|
||||
XCTAssertEqual(mbglTileset.tiles[0], "tile.1");
|
||||
XCTAssertEqual(mbglTileset.tiles[1], "tile.2");
|
||||
XCTAssertEqual(mbglTileset.tiles[2], "tile.3");
|
||||
|
||||
// has the default scheme
|
||||
XCTAssertEqual(mbglTileset.scheme, mbgl::Tileset::Scheme::XYZ);
|
||||
|
||||
// when the tile set has no min or max zoom level set
|
||||
tileSet.minimumZoomLevel = nil;
|
||||
tileSet.maximumZoomLevel = nil;
|
||||
|
||||
// the mbgl object has default values for min and max zoom level
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.min, 0);
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.max, 22);
|
||||
|
||||
// when the tile set has min and/or max zoom level set
|
||||
tileSet.minimumZoomLevel = @(1);
|
||||
tileSet.maximumZoomLevel = @(2);
|
||||
|
||||
// the mbgl object reflects the set values for min and max zoom level
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.min, 1);
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.max, 2);
|
||||
|
||||
// when the tile set has an attribution
|
||||
tileSet.attribution = @"my tileset © ©️🎈";
|
||||
|
||||
// the attribution is reflected by the mbgl tileset
|
||||
XCTAssertEqual([tileSet mbglTileset].attribution, tileSet.attribution.UTF8String);
|
||||
|
||||
// when the scheme is changed
|
||||
tileSet.scheme = MGLTileSetSchemeTMS;
|
||||
|
||||
// the scheme is reflected by the mbgl tileset
|
||||
XCTAssertEqual([tileSet mbglTileset].scheme , mbgl::Tileset::Scheme::TMS);
|
||||
|
||||
// a tile set that provides an mbgl tile set and minimum and maximum zoom levels
|
||||
tileSet = [[MGLTileSet alloc] initWithTileURLTemplates:@[@"tile.1"] minimumZoomLevel:15 maximumZoomLevel:20];
|
||||
|
||||
// the zoom levels are reflected by the mbgl tileset
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.min, 15);
|
||||
XCTAssertEqual([tileSet mbglTileset].zoomRange.max, 20);
|
||||
}
|
||||
|
||||
- (void)testInvalidTileSet {
|
||||
// a tile set that provides an mbgl tile set and invalid (crossed) minimum and maximum zoom levels throws an exception
|
||||
XCTAssertThrowsSpecificNamed([[MGLTileSet alloc] initWithTileURLTemplates:@[@"tile.1"] minimumZoomLevel:10 maximumZoomLevel:9], NSException, @"Invalid minimumZoomLevel");
|
||||
|
||||
// a tile set that provides an mbgl tile set
|
||||
MGLTileSet *tileSet = [[MGLTileSet alloc] initWithTileURLTemplates:@[@"tile.1"]];
|
||||
tileSet.maximumZoomLevel = @(10);
|
||||
|
||||
// when the minimum zoom level is set higher than the maximum zoom level
|
||||
XCTAssertThrowsSpecificNamed(tileSet.minimumZoomLevel = @(11), NSException, @"Invalid minimumZoomLevel");
|
||||
|
||||
// when the maximum zoom level is set lower than the minimum zoom level
|
||||
tileSet.minimumZoomLevel = @(5);
|
||||
XCTAssertThrowsSpecificNamed(tileSet.maximumZoomLevel = @(4), NSException, @"Invalid minimumZoomLevel");
|
||||
}
|
||||
|
||||
@end
|
||||
3
platform/ios/test/test-Bridging-Header.h
Normal file
3
platform/ios/test/test-Bridging-Header.h
Normal file
@@ -0,0 +1,3 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
Reference in New Issue
Block a user