@maplibre/maplibre-react-native 10.1.0 → 10.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/MLRN/CameraStop.h +1 -1
- package/ios/MLRN/CameraStop.m +58 -60
- package/ios/MLRN/CameraUpdateItem.h +2 -1
- package/ios/MLRN/CameraUpdateItem.m +132 -132
- package/ios/MLRN/CameraUpdateQueue.m +43 -47
- package/ios/MLRN/FilterParser.h +1 -1
- package/ios/MLRN/FilterParser.m +5 -6
- package/ios/MLRN/MLRNBackgroundLayer.m +10 -9
- package/ios/MLRN/MLRNBackgroundLayerManager.m +4 -5
- package/ios/MLRN/MLRNCallout.h +1 -1
- package/ios/MLRN/MLRNCallout.m +37 -36
- package/ios/MLRN/MLRNCalloutManager.m +2 -3
- package/ios/MLRN/MLRNCamera.h +1 -1
- package/ios/MLRN/MLRNCamera.m +169 -182
- package/ios/MLRN/MLRNCameraManager.m +4 -6
- package/ios/MLRN/MLRNCircleLayer.m +17 -14
- package/ios/MLRN/MLRNCircleLayerManager.m +4 -5
- package/ios/MLRN/MLRNCustomHeaders.h +2 -2
- package/ios/MLRN/MLRNCustomHeaders.m +63 -63
- package/ios/MLRN/MLRNEvent.h +3 -3
- package/ios/MLRN/MLRNEvent.m +19 -24
- package/ios/MLRN/MLRNEventProtocol.h +1 -1
- package/ios/MLRN/MLRNFillExtrusionLayer.m +18 -14
- package/ios/MLRN/MLRNFillExtrusionLayerManager.m +4 -5
- package/ios/MLRN/MLRNFillLayer.m +16 -14
- package/ios/MLRN/MLRNFillLayerManager.m +4 -5
- package/ios/MLRN/MLRNHeatmapLayer.m +17 -14
- package/ios/MLRN/MLRNHeatmapLayerManager.m +4 -5
- package/ios/MLRN/MLRNImageQueue.h +4 -1
- package/ios/MLRN/MLRNImageQueue.m +29 -32
- package/ios/MLRN/MLRNImageQueueOperation.h +1 -1
- package/ios/MLRN/MLRNImageQueueOperation.m +92 -91
- package/ios/MLRN/MLRNImageSource.m +36 -38
- package/ios/MLRN/MLRNImageSourceManager.m +2 -3
- package/ios/MLRN/MLRNImageUtils.h +3 -3
- package/ios/MLRN/MLRNImageUtils.m +15 -14
- package/ios/MLRN/MLRNImages.h +0 -1
- package/ios/MLRN/MLRNImages.m +89 -91
- package/ios/MLRN/MLRNImagesManager.m +4 -5
- package/ios/MLRN/MLRNLayer.h +9 -11
- package/ios/MLRN/MLRNLayer.m +170 -182
- package/ios/MLRN/MLRNLight.m +21 -23
- package/ios/MLRN/MLRNLightManager.m +2 -3
- package/ios/MLRN/MLRNLineLayer.m +17 -15
- package/ios/MLRN/MLRNLineLayerManager.m +4 -6
- package/ios/MLRN/MLRNLocation.h +1 -1
- package/ios/MLRN/MLRNLocation.m +16 -17
- package/ios/MLRN/MLRNLocationManager.m +109 -124
- package/ios/MLRN/MLRNLocationManagerDelegate.h +3 -3
- package/ios/MLRN/MLRNLocationModule.h +1 -1
- package/ios/MLRN/MLRNLocationModule.m +40 -55
- package/ios/MLRN/MLRNLogging.h +1 -4
- package/ios/MLRN/MLRNLogging.m +84 -89
- package/ios/MLRN/MLRNMapTouchEvent.h +2 -2
- package/ios/MLRN/MLRNMapTouchEvent.m +50 -49
- package/ios/MLRN/MLRNMapView.h +43 -36
- package/ios/MLRN/MLRNMapView.m +409 -440
- package/ios/MLRN/MLRNMapViewManager.m +489 -502
- package/ios/MLRN/MLRNModule.h +1 -1
- package/ios/MLRN/MLRNModule.m +111 -105
- package/ios/MLRN/MLRNNativeUserLocation.m +24 -27
- package/ios/MLRN/MLRNNativeUserLocationManager.m +4 -8
- package/ios/MLRN/MLRNOfflineModule.h +1 -1
- package/ios/MLRN/MLRNOfflineModule.m +416 -421
- package/ios/MLRN/MLRNPointAnnotation.h +2 -2
- package/ios/MLRN/MLRNPointAnnotation.m +154 -175
- package/ios/MLRN/MLRNPointAnnotationManager.m +2 -3
- package/ios/MLRN/MLRNRasterLayer.m +16 -12
- package/ios/MLRN/MLRNRasterLayerManager.m +4 -5
- package/ios/MLRN/MLRNRasterSource.m +21 -17
- package/ios/MLRN/MLRNRasterSourceManager.m +2 -3
- package/ios/MLRN/MLRNShapeSource.h +17 -16
- package/ios/MLRN/MLRNShapeSource.m +94 -102
- package/ios/MLRN/MLRNShapeSourceManager.h +2 -2
- package/ios/MLRN/MLRNShapeSourceManager.m +86 -90
- package/ios/MLRN/MLRNSnapshotModule.h +1 -1
- package/ios/MLRN/MLRNSnapshotModule.m +51 -53
- package/ios/MLRN/MLRNSource.h +12 -12
- package/ios/MLRN/MLRNSource.m +82 -88
- package/ios/MLRN/MLRNStyleValue.h +1 -1
- package/ios/MLRN/MLRNStyleValue.m +128 -128
- package/ios/MLRN/MLRNSymbolLayer.m +17 -13
- package/ios/MLRN/MLRNSymbolLayerManager.m +4 -5
- package/ios/MLRN/MLRNTileSource.h +1 -1
- package/ios/MLRN/MLRNTileSource.m +21 -20
- package/ios/MLRN/MLRNUserLocation.h +1 -1
- package/ios/MLRN/MLRNUserLocation.m +10 -12
- package/ios/MLRN/MLRNUtils.h +18 -11
- package/ios/MLRN/MLRNUtils.m +168 -160
- package/ios/MLRN/MLRNVectorLayer.m +28 -34
- package/ios/MLRN/MLRNVectorSource.h +3 -1
- package/ios/MLRN/MLRNVectorSource.m +14 -11
- package/ios/MLRN/MLRNVectorSourceManager.h +2 -2
- package/ios/MLRN/MLRNVectorSourceManager.m +36 -39
- package/ios/MLRN/ViewManager.h +1 -1
- package/ios/MLRN/ViewManager.m +29 -35
- package/lib/commonjs/components/MarkerView.js +1 -1
- package/lib/commonjs/components/ShapeSource.js +2 -1
- package/lib/commonjs/components/ShapeSource.js.map +1 -1
- package/lib/commonjs/components/UserLocation.js +8 -38
- package/lib/commonjs/components/UserLocation.js.map +1 -1
- package/lib/commonjs/components/UserLocationPuck.js +52 -0
- package/lib/commonjs/components/UserLocationPuck.js.map +1 -0
- package/lib/commonjs/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +12 -9
- package/lib/commonjs/components/UserLocationPuckHeading.js.map +1 -0
- package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js +8 -7
- package/lib/commonjs/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -2
- package/lib/commonjs/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js +28 -38
- package/lib/commonjs/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
- package/lib/commonjs/utils/animated/AnimatedShape.js +11 -7
- package/lib/commonjs/utils/animated/AnimatedShape.js.map +1 -1
- package/lib/module/components/MarkerView.js +1 -1
- package/lib/module/components/ShapeSource.js +2 -1
- package/lib/module/components/ShapeSource.js.map +1 -1
- package/lib/module/components/UserLocation.js +7 -36
- package/lib/module/components/UserLocation.js.map +1 -1
- package/lib/module/components/UserLocationPuck.js +48 -0
- package/lib/module/components/UserLocationPuck.js.map +1 -0
- package/lib/module/components/{HeadingIndicator.js → UserLocationPuckHeading.js} +11 -7
- package/lib/module/components/UserLocationPuckHeading.js.map +1 -0
- package/lib/module/utils/animated/AbstractAnimatedCoordinates.js +8 -7
- package/lib/module/utils/animated/AbstractAnimatedCoordinates.js.map +1 -1
- package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js +1 -3
- package/lib/module/utils/animated/AnimatedExtractCoordinateFromArray.js.map +1 -1
- package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js +29 -39
- package/lib/module/utils/animated/AnimatedRouteCoordinatesArray.js.map +1 -1
- package/lib/module/utils/animated/AnimatedShape.js +11 -7
- package/lib/module/utils/animated/AnimatedShape.js.map +1 -1
- package/lib/typescript/commonjs/src/components/MarkerView.d.ts +1 -1
- package/lib/typescript/commonjs/src/components/ShapeSource.d.ts +1 -1
- package/lib/typescript/commonjs/src/components/ShapeSource.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/components/UserLocation.d.ts +0 -1
- package/lib/typescript/commonjs/src/components/UserLocation.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts +9 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuck.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts +9 -0
- package/lib/typescript/commonjs/src/components/UserLocationPuckHeading.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
- package/lib/typescript/commonjs/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
- package/lib/typescript/commonjs/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts +0 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
- package/lib/typescript/commonjs/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts +8 -5
- package/lib/typescript/commonjs/src/utils/animated/AnimatedShape.d.ts.map +1 -1
- package/lib/typescript/module/src/components/MarkerView.d.ts +1 -1
- package/lib/typescript/module/src/components/ShapeSource.d.ts +1 -1
- package/lib/typescript/module/src/components/ShapeSource.d.ts.map +1 -1
- package/lib/typescript/module/src/components/UserLocation.d.ts +0 -1
- package/lib/typescript/module/src/components/UserLocation.d.ts.map +1 -1
- package/lib/typescript/module/src/components/UserLocationPuck.d.ts +9 -0
- package/lib/typescript/module/src/components/UserLocationPuck.d.ts.map +1 -0
- package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts +9 -0
- package/lib/typescript/module/src/components/UserLocationPuckHeading.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts +12 -13
- package/lib/typescript/module/src/utils/animated/AbstractAnimatedCoordinates.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts +5 -4
- package/lib/typescript/module/src/utils/animated/AnimatedExtractCoordinateFromArray.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts +0 -1
- package/lib/typescript/module/src/utils/animated/AnimatedPoint.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts +33 -21
- package/lib/typescript/module/src/utils/animated/AnimatedRouteCoordinatesArray.d.ts.map +1 -1
- package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts +8 -5
- package/lib/typescript/module/src/utils/animated/AnimatedShape.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/components/MarkerView.tsx +1 -1
- package/src/components/ShapeSource.tsx +58 -53
- package/src/components/UserLocation.tsx +13 -51
- package/src/components/UserLocationPuck.tsx +62 -0
- package/src/components/UserLocationPuckHeading.tsx +33 -0
- package/src/utils/animated/AbstractAnimatedCoordinates.ts +26 -15
- package/src/utils/animated/AnimatedExtractCoordinateFromArray.ts +10 -6
- package/src/utils/animated/AnimatedRouteCoordinatesArray.ts +63 -51
- package/src/utils/animated/AnimatedShape.ts +22 -13
- package/lib/commonjs/components/HeadingIndicator.js.map +0 -1
- package/lib/module/components/HeadingIndicator.js.map +0 -1
- package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts +0 -7
- package/lib/typescript/commonjs/src/components/HeadingIndicator.d.ts.map +0 -1
- package/lib/typescript/module/src/components/HeadingIndicator.d.ts +0 -7
- package/lib/typescript/module/src/components/HeadingIndicator.d.ts.map +0 -1
- package/src/components/HeadingIndicator.tsx +0 -26
|
@@ -1,66 +1,64 @@
|
|
|
1
1
|
#import <React/RCTUIManager.h>
|
|
2
2
|
|
|
3
|
-
#import "MLRNMapViewManager.h"
|
|
4
|
-
#import "MLRNMapView.h"
|
|
5
|
-
#import "MLRNEventTypes.h"
|
|
6
|
-
#import "MLRNEvent.h"
|
|
7
|
-
#import "MLRNMapTouchEvent.h"
|
|
8
|
-
#import "MLRNUtils.h"
|
|
9
3
|
#import "CameraStop.h"
|
|
10
4
|
#import "CameraUpdateQueue.h"
|
|
11
|
-
#import "MLRNUserLocation.h"
|
|
12
5
|
#import "FilterParser.h"
|
|
6
|
+
#import "MLRNEvent.h"
|
|
7
|
+
#import "MLRNEventTypes.h"
|
|
13
8
|
#import "MLRNImages.h"
|
|
9
|
+
#import "MLRNMapTouchEvent.h"
|
|
10
|
+
#import "MLRNMapView.h"
|
|
11
|
+
#import "MLRNMapViewManager.h"
|
|
12
|
+
#import "MLRNUserLocation.h"
|
|
13
|
+
#import "MLRNUtils.h"
|
|
14
14
|
|
|
15
|
-
@interface MLRNMapViewManager() <MLNMapViewDelegate>
|
|
15
|
+
@interface MLRNMapViewManager () <MLNMapViewDelegate>
|
|
16
16
|
@end
|
|
17
17
|
|
|
18
18
|
@implementation MLRNMapViewManager
|
|
19
19
|
|
|
20
|
-
|
|
21
20
|
RCT_EXPORT_MODULE(MLRNMapView)
|
|
22
21
|
|
|
23
|
-
- (BOOL)requiresMainQueueSetup
|
|
24
|
-
|
|
25
|
-
return YES;
|
|
22
|
+
- (BOOL)requiresMainQueueSetup {
|
|
23
|
+
return YES;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
// prevents SDK from crashing and cluttering logs
|
|
29
27
|
// since we don't have access to the frame right away
|
|
30
|
-
- (CGRect)defaultFrame
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
28
|
+
- (CGRect)defaultFrame {
|
|
29
|
+
return [[UIScreen mainScreen] bounds];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (UIView *)view {
|
|
33
|
+
MLRNMapView *mapView = [[MLRNMapView alloc] initWithFrame:[self defaultFrame]];
|
|
34
|
+
mapView.delegate = self;
|
|
35
|
+
|
|
36
|
+
// setup map gesture recongizers
|
|
37
|
+
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self
|
|
38
|
+
action:nil];
|
|
39
|
+
doubleTap.numberOfTapsRequired = 2;
|
|
40
|
+
|
|
41
|
+
UITapGestureRecognizer *tap =
|
|
42
|
+
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapMap:)];
|
|
43
|
+
[tap requireGestureRecognizerToFail:doubleTap];
|
|
44
|
+
|
|
45
|
+
UILongPressGestureRecognizer *longPress =
|
|
46
|
+
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(didLongPressMap:)];
|
|
47
|
+
|
|
48
|
+
// this allows the internal annotation gestures to take precedents over the map tap gesture
|
|
49
|
+
for (int i = 0; i < mapView.gestureRecognizers.count; i++) {
|
|
50
|
+
UIGestureRecognizer *gestuerReconginer = mapView.gestureRecognizers[i];
|
|
51
|
+
|
|
52
|
+
if ([gestuerReconginer isKindOfClass:[UITapGestureRecognizer class]]) {
|
|
53
|
+
[tap requireGestureRecognizerToFail:gestuerReconginer];
|
|
57
54
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
[mapView addGestureRecognizer:doubleTap];
|
|
58
|
+
[mapView addGestureRecognizer:tap];
|
|
59
|
+
[mapView addGestureRecognizer:longPress];
|
|
60
|
+
|
|
61
|
+
return mapView;
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
#pragma mark - React View Props
|
|
@@ -91,527 +89,516 @@ RCT_EXPORT_VIEW_PROPERTY(onMapChange, RCTBubblingEventBlock)
|
|
|
91
89
|
|
|
92
90
|
#pragma mark - React Methods
|
|
93
91
|
|
|
94
|
-
RCT_EXPORT_METHOD(getPointInView:(nonnull NSNumber*)reactTag
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
{
|
|
99
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
100
|
-
id view = viewRegistry[reactTag];
|
|
101
|
-
|
|
102
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
103
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
108
|
-
|
|
109
|
-
CGPoint pointInView = [reactMapView convertCoordinate:CLLocationCoordinate2DMake([coordinate[1] doubleValue], [coordinate[0] doubleValue])
|
|
110
|
-
toPointToView:reactMapView];
|
|
111
|
-
|
|
112
|
-
resolve(@{ @"pointInView": @[@(pointInView.x), @(pointInView.y)] });
|
|
113
|
-
}];
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
RCT_EXPORT_METHOD(getCoordinateFromView:(nonnull NSNumber*)reactTag
|
|
117
|
-
atPoint:(CGPoint)point
|
|
118
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
119
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
120
|
-
{
|
|
121
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
92
|
+
RCT_EXPORT_METHOD(getPointInView : (nonnull NSNumber *)reactTag atCoordinate : (
|
|
93
|
+
NSArray<NSNumber *> *)coordinate resolver : (RCTPromiseResolveBlock)
|
|
94
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
95
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
96
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
122
97
|
id view = viewRegistry[reactTag];
|
|
123
|
-
|
|
98
|
+
|
|
124
99
|
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
125
100
|
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
126
101
|
return;
|
|
127
102
|
}
|
|
128
|
-
|
|
129
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
130
|
-
|
|
103
|
+
|
|
104
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
105
|
+
|
|
106
|
+
CGPoint pointInView =
|
|
107
|
+
[reactMapView convertCoordinate:CLLocationCoordinate2DMake([coordinate[1] doubleValue],
|
|
108
|
+
[coordinate[0] doubleValue])
|
|
109
|
+
toPointToView:reactMapView];
|
|
110
|
+
|
|
111
|
+
resolve(@{@"pointInView" : @[ @(pointInView.x), @(pointInView.y) ]});
|
|
112
|
+
}];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
RCT_EXPORT_METHOD(getCoordinateFromView : (nonnull NSNumber *)reactTag atPoint : (CGPoint)
|
|
116
|
+
point resolver : (RCTPromiseResolveBlock)
|
|
117
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
118
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
119
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
120
|
+
id view = viewRegistry[reactTag];
|
|
121
|
+
|
|
122
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
123
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
128
|
+
|
|
131
129
|
CLLocationCoordinate2D coordinate = [reactMapView convertPoint:point
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
resolve(@{
|
|
130
|
+
toCoordinateFromView:reactMapView];
|
|
131
|
+
|
|
132
|
+
resolve(@{@"coordinateFromView" : @[ @(coordinate.longitude), @(coordinate.latitude) ]});
|
|
135
133
|
}];
|
|
136
134
|
}
|
|
137
135
|
|
|
136
|
+
RCT_EXPORT_METHOD(takeSnap : (nonnull NSNumber *)reactTag writeToDisk : (BOOL)
|
|
137
|
+
writeToDisk resolver : (RCTPromiseResolveBlock)
|
|
138
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
139
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
140
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
141
|
+
id view = viewRegistry[reactTag];
|
|
142
|
+
|
|
143
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
144
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
138
147
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
{
|
|
144
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
145
|
-
id view = viewRegistry[reactTag];
|
|
146
|
-
|
|
147
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
148
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
153
|
-
NSString *uri = [reactMapView takeSnap:writeToDisk];
|
|
154
|
-
resolve(@{ @"uri": uri });
|
|
155
|
-
}];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
RCT_EXPORT_METHOD(getVisibleBounds:(nonnull NSNumber*)reactTag
|
|
159
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
160
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
161
|
-
{
|
|
162
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
163
|
-
id view = viewRegistry[reactTag];
|
|
164
|
-
|
|
165
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
166
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
171
|
-
resolve(@{ @"visibleBounds": [MLRNUtils fromCoordinateBounds:reactMapView.visibleCoordinateBounds] });
|
|
172
|
-
}];
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
RCT_EXPORT_METHOD(getZoom:(nonnull NSNumber*)reactTag
|
|
176
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
177
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
178
|
-
{
|
|
179
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
180
|
-
id view = viewRegistry[reactTag];
|
|
181
|
-
|
|
182
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
183
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
188
|
-
resolve(@{ @"zoom": @(reactMapView.zoomLevel) });
|
|
189
|
-
}];
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
RCT_EXPORT_METHOD(getCenter:(nonnull NSNumber*)reactTag
|
|
193
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
194
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
195
|
-
{
|
|
196
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
197
|
-
id view = viewRegistry[reactTag];
|
|
198
|
-
|
|
199
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
200
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
205
|
-
resolve(@{ @"center": @[@(reactMapView.centerCoordinate.longitude), @(reactMapView.centerCoordinate.latitude)]});
|
|
206
|
-
}];
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
RCT_EXPORT_METHOD(queryRenderedFeaturesAtPoint:(nonnull NSNumber*)reactTag
|
|
210
|
-
atPoint:(NSArray<NSNumber*>*)point
|
|
211
|
-
withFilter:(NSArray*)filter
|
|
212
|
-
withLayerIDs:(NSArray<NSString*>*)layerIDs
|
|
213
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
214
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
215
|
-
{
|
|
216
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
217
|
-
id view = viewRegistry[reactTag];
|
|
218
|
-
|
|
219
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
220
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
NSSet *layerIDSet = nil;
|
|
225
|
-
if (layerIDs != nil && layerIDs.count > 0) {
|
|
226
|
-
layerIDSet = [NSSet setWithArray:layerIDs];
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
230
|
-
NSPredicate* predicate = [FilterParser parse:filter];
|
|
231
|
-
NSArray<id<MLNFeature>> *shapes = [reactMapView visibleFeaturesAtPoint:CGPointMake([point[0] floatValue], [point[1] floatValue])
|
|
232
|
-
inStyleLayersWithIdentifiers:layerIDSet
|
|
233
|
-
predicate:predicate];
|
|
234
|
-
|
|
235
|
-
NSMutableArray<NSDictionary*> *features = [[NSMutableArray alloc] init];
|
|
236
|
-
for (int i = 0; i < shapes.count; i++) {
|
|
237
|
-
[features addObject:shapes[i].geoJSONDictionary];
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
resolve(@{
|
|
241
|
-
@"data": @{ @"type": @"FeatureCollection", @"features": features }
|
|
242
|
-
});
|
|
243
|
-
}];
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
RCT_EXPORT_METHOD(queryRenderedFeaturesInRect:(nonnull NSNumber*)reactTag
|
|
247
|
-
withBBox:(NSArray<NSNumber*>*)bbox
|
|
248
|
-
withFilter:(NSArray*)filter
|
|
249
|
-
withLayerIDs:(NSArray<NSString*>*)layerIDs
|
|
250
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
251
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
252
|
-
{
|
|
253
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
254
|
-
id view = viewRegistry[reactTag];
|
|
255
|
-
|
|
256
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
257
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
262
|
-
|
|
263
|
-
// bbox[top, right, bottom, left]
|
|
264
|
-
CGFloat width = [bbox[1] floatValue] - [bbox[3] floatValue];
|
|
265
|
-
CGFloat height = [bbox[0] floatValue] - [bbox[2] floatValue];
|
|
266
|
-
CGRect rect = CGRectMake([bbox[3] floatValue], [bbox[2] floatValue], width, height);
|
|
267
|
-
|
|
268
|
-
NSSet *layerIDSet = nil;
|
|
269
|
-
if (layerIDs != nil && layerIDs.count > 0) {
|
|
270
|
-
layerIDSet = [NSSet setWithArray:layerIDs];
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
NSPredicate* predicate = [FilterParser parse:filter];
|
|
274
|
-
NSArray<id<MLNFeature>> *shapes = [reactMapView visibleFeaturesInRect:rect
|
|
275
|
-
inStyleLayersWithIdentifiers:layerIDSet
|
|
276
|
-
predicate:predicate];
|
|
277
|
-
|
|
278
|
-
NSArray<NSDictionary*>* features = [self featuresToJSON:shapes];
|
|
279
|
-
|
|
280
|
-
resolve(@{ @"data": @{ @"type": @"FeatureCollection", @"features": features }});
|
|
281
|
-
}];
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
RCT_EXPORT_METHOD(showAttribution:(nonnull NSNumber *)reactTag
|
|
285
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
286
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
287
|
-
{
|
|
288
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
289
|
-
id view = viewRegistry[reactTag];
|
|
290
|
-
|
|
291
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
292
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
__weak MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
297
|
-
[reactMapView showAttribution:reactMapView];
|
|
298
|
-
resolve(nil);
|
|
299
|
-
}];
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
RCT_EXPORT_METHOD(setSourceVisibility:(nonnull NSNumber *)reactTag
|
|
303
|
-
visible:(BOOL)visible
|
|
304
|
-
sourceId:(nonnull NSString*)sourceId
|
|
305
|
-
sourceLayerId:(nullable NSString*)sourceLayerId
|
|
306
|
-
resolver:(RCTPromiseResolveBlock)resolve
|
|
307
|
-
rejecter:(RCTPromiseRejectBlock)reject)
|
|
308
|
-
{
|
|
309
|
-
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager, NSDictionary<NSNumber*, UIView*> *viewRegistry) {
|
|
310
|
-
id view = viewRegistry[reactTag];
|
|
311
|
-
|
|
312
|
-
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
313
|
-
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
__weak MLRNMapView *reactMapView = (MLRNMapView*)view;
|
|
318
|
-
[reactMapView setSourceVisibility:visible sourceId:sourceId sourceLayerId:sourceLayerId];
|
|
319
|
-
resolve(nil);
|
|
320
|
-
}];
|
|
148
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
149
|
+
NSString *uri = [reactMapView takeSnap:writeToDisk];
|
|
150
|
+
resolve(@{@"uri" : uri});
|
|
151
|
+
}];
|
|
321
152
|
}
|
|
322
153
|
|
|
323
|
-
|
|
154
|
+
RCT_EXPORT_METHOD(getVisibleBounds : (nonnull NSNumber *)reactTag resolver : (
|
|
155
|
+
RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
156
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
157
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
158
|
+
id view = viewRegistry[reactTag];
|
|
324
159
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
CGPoint screenPoint = [recognizer locationInView:mapView];
|
|
329
|
-
NSArray<MLRNSource *> *touchableSources = [mapView getAllTouchableSources];
|
|
330
|
-
|
|
331
|
-
NSMutableDictionary<NSString *, NSArray<id<MLNFeature>>* > *hits = [[NSMutableDictionary alloc] init];
|
|
332
|
-
NSMutableArray<MLRNSource *> *hitTouchableSources = [[NSMutableArray alloc] init];
|
|
333
|
-
for (MLRNSource *touchableSource in touchableSources) {
|
|
334
|
-
NSDictionary<NSString *, NSNumber *> *hitbox = touchableSource.hitbox;
|
|
335
|
-
float halfWidth = [hitbox[@"width"] floatValue] / 2.f;
|
|
336
|
-
float halfHeight = [hitbox[@"height"] floatValue] / 2.f;
|
|
337
|
-
|
|
338
|
-
CGFloat top = screenPoint.y - halfHeight;
|
|
339
|
-
CGFloat left = screenPoint.x - halfWidth;
|
|
340
|
-
CGRect hitboxRect = CGRectMake(left, top, [hitbox[@"width"] floatValue], [hitbox[@"height"] floatValue]);
|
|
341
|
-
|
|
342
|
-
NSArray<id<MLNFeature>> *features = [mapView visibleFeaturesInRect:hitboxRect
|
|
343
|
-
inStyleLayersWithIdentifiers:[NSSet setWithArray:[touchableSource getLayerIDs]]
|
|
344
|
-
predicate:nil];
|
|
345
|
-
|
|
346
|
-
if (features.count > 0) {
|
|
347
|
-
hits[touchableSource.id] = features;
|
|
348
|
-
[hitTouchableSources addObject:touchableSource];
|
|
349
|
-
}
|
|
160
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
161
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
162
|
+
return;
|
|
350
163
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
@"x": [NSNumber numberWithDouble: screenPoint.x],
|
|
369
|
-
@"y":[NSNumber numberWithDouble: screenPoint.y]
|
|
370
|
-
},
|
|
371
|
-
@"coordinates": @{
|
|
372
|
-
@"latitude": [NSNumber numberWithDouble: coordinate.latitude],
|
|
373
|
-
@"longitude": [NSNumber numberWithDouble: coordinate.longitude]
|
|
374
|
-
}
|
|
375
|
-
}];
|
|
376
|
-
[self fireEvent:event withCallback:source.onPress];
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
164
|
+
|
|
165
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
166
|
+
resolve(@{
|
|
167
|
+
@"visibleBounds" : [MLRNUtils fromCoordinateBounds:reactMapView.visibleCoordinateBounds]
|
|
168
|
+
});
|
|
169
|
+
}];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
RCT_EXPORT_METHOD(getZoom : (nonnull NSNumber *)reactTag resolver : (RCTPromiseResolveBlock)
|
|
173
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
174
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
175
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
176
|
+
id view = viewRegistry[reactTag];
|
|
177
|
+
|
|
178
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
179
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
180
|
+
return;
|
|
379
181
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
182
|
+
|
|
183
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
184
|
+
resolve(@{@"zoom" : @(reactMapView.zoomLevel)});
|
|
185
|
+
}];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
RCT_EXPORT_METHOD(getCenter : (nonnull NSNumber *)reactTag resolver : (RCTPromiseResolveBlock)
|
|
189
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
190
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
191
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
192
|
+
id view = viewRegistry[reactTag];
|
|
193
|
+
|
|
194
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
195
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
196
|
+
return;
|
|
383
197
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
198
|
+
|
|
199
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
200
|
+
resolve(@{
|
|
201
|
+
@"center" :
|
|
202
|
+
@[ @(reactMapView.centerCoordinate.longitude), @(reactMapView.centerCoordinate.latitude) ]
|
|
203
|
+
});
|
|
204
|
+
}];
|
|
387
205
|
}
|
|
388
206
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
207
|
+
RCT_EXPORT_METHOD(queryRenderedFeaturesAtPoint : (nonnull NSNumber *)reactTag atPoint : (
|
|
208
|
+
NSArray<NSNumber *> *)point withFilter : (NSArray *)
|
|
209
|
+
filter withLayerIDs : (NSArray<NSString *> *)layerIDs resolver : (
|
|
210
|
+
RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
211
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
212
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
213
|
+
id view = viewRegistry[reactTag];
|
|
214
|
+
|
|
215
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
216
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
NSSet *layerIDSet = nil;
|
|
221
|
+
if (layerIDs != nil && layerIDs.count > 0) {
|
|
222
|
+
layerIDSet = [NSSet setWithArray:layerIDs];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
226
|
+
NSPredicate *predicate = [FilterParser parse:filter];
|
|
227
|
+
NSArray<id<MLNFeature>> *shapes = [reactMapView
|
|
228
|
+
visibleFeaturesAtPoint:CGPointMake([point[0] floatValue], [point[1] floatValue])
|
|
229
|
+
inStyleLayersWithIdentifiers:layerIDSet
|
|
230
|
+
predicate:predicate];
|
|
231
|
+
|
|
232
|
+
NSMutableArray<NSDictionary *> *features = [[NSMutableArray alloc] init];
|
|
233
|
+
for (int i = 0; i < shapes.count; i++) {
|
|
234
|
+
[features addObject:shapes[i].geoJSONDictionary];
|
|
395
235
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
236
|
+
|
|
237
|
+
resolve(@{@"data" : @{@"type" : @"FeatureCollection", @"features" : features}});
|
|
238
|
+
}];
|
|
399
239
|
}
|
|
400
240
|
|
|
401
|
-
|
|
241
|
+
RCT_EXPORT_METHOD(queryRenderedFeaturesInRect : (nonnull NSNumber *)reactTag withBBox : (
|
|
242
|
+
NSArray<NSNumber *> *)bbox withFilter : (NSArray *)filter withLayerIDs : (NSArray<NSString *> *)
|
|
243
|
+
layerIDs resolver : (RCTPromiseResolveBlock)
|
|
244
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
245
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
246
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
247
|
+
id view = viewRegistry[reactTag];
|
|
402
248
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
MLRNMapView* reactMapView = ((MLRNMapView *) mapView);
|
|
407
|
-
if (reactMapView.useNativeUserLocationAnnotationView) {
|
|
408
|
-
return nil;
|
|
409
|
-
}
|
|
410
|
-
return [[MLRNUserLocation sharedInstance] hiddenUserAnnotation];
|
|
249
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
250
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
251
|
+
return;
|
|
411
252
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
253
|
+
|
|
254
|
+
MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
255
|
+
|
|
256
|
+
// bbox[top, right, bottom, left]
|
|
257
|
+
CGFloat width = [bbox[1] floatValue] - [bbox[3] floatValue];
|
|
258
|
+
CGFloat height = [bbox[0] floatValue] - [bbox[2] floatValue];
|
|
259
|
+
CGRect rect = CGRectMake([bbox[3] floatValue], [bbox[2] floatValue], width, height);
|
|
260
|
+
|
|
261
|
+
NSSet *layerIDSet = nil;
|
|
262
|
+
if (layerIDs != nil && layerIDs.count > 0) {
|
|
263
|
+
layerIDSet = [NSSet setWithArray:layerIDs];
|
|
415
264
|
}
|
|
416
|
-
|
|
265
|
+
|
|
266
|
+
NSPredicate *predicate = [FilterParser parse:filter];
|
|
267
|
+
NSArray<id<MLNFeature>> *shapes = [reactMapView visibleFeaturesInRect:rect
|
|
268
|
+
inStyleLayersWithIdentifiers:layerIDSet
|
|
269
|
+
predicate:predicate];
|
|
270
|
+
|
|
271
|
+
NSArray<NSDictionary *> *features = [self featuresToJSON:shapes];
|
|
272
|
+
|
|
273
|
+
resolve(@{@"data" : @{@"type" : @"FeatureCollection", @"features" : features}});
|
|
274
|
+
}];
|
|
417
275
|
}
|
|
418
276
|
|
|
419
|
-
|
|
420
|
-
{
|
|
421
|
-
|
|
422
|
-
|
|
277
|
+
RCT_EXPORT_METHOD(showAttribution : (nonnull NSNumber *)reactTag resolver : (RCTPromiseResolveBlock)
|
|
278
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
279
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
280
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
281
|
+
id view = viewRegistry[reactTag];
|
|
282
|
+
|
|
283
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
284
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
__weak MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
289
|
+
[reactMapView showAttribution:reactMapView];
|
|
290
|
+
resolve(nil);
|
|
291
|
+
}];
|
|
423
292
|
}
|
|
424
293
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
294
|
+
RCT_EXPORT_METHOD(setSourceVisibility : (nonnull NSNumber *)reactTag visible : (
|
|
295
|
+
BOOL)visible sourceId : (nonnull NSString *)sourceId sourceLayerId : (nullable NSString *)
|
|
296
|
+
sourceLayerId resolver : (RCTPromiseResolveBlock)
|
|
297
|
+
resolve rejecter : (RCTPromiseRejectBlock)reject) {
|
|
298
|
+
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *manager,
|
|
299
|
+
NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
300
|
+
id view = viewRegistry[reactTag];
|
|
301
|
+
|
|
302
|
+
if (![view isKindOfClass:[MLRNMapView class]]) {
|
|
303
|
+
RCTLogError(@"Invalid react tag, could not find MLRNMapView");
|
|
304
|
+
return;
|
|
434
305
|
}
|
|
306
|
+
|
|
307
|
+
__weak MLRNMapView *reactMapView = (MLRNMapView *)view;
|
|
308
|
+
[reactMapView setSourceVisibility:visible sourceId:sourceId sourceLayerId:sourceLayerId];
|
|
309
|
+
resolve(nil);
|
|
310
|
+
}];
|
|
435
311
|
}
|
|
436
312
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
313
|
+
#pragma mark - UIGestureRecognizers
|
|
314
|
+
|
|
315
|
+
- (void)didTapMap:(UITapGestureRecognizer *)recognizer {
|
|
316
|
+
MLRNMapView *mapView = (MLRNMapView *)recognizer.view;
|
|
317
|
+
CGPoint screenPoint = [recognizer locationInView:mapView];
|
|
318
|
+
NSArray<MLRNSource *> *touchableSources = [mapView getAllTouchableSources];
|
|
319
|
+
|
|
320
|
+
NSMutableDictionary<NSString *, NSArray<id<MLNFeature>> *> *hits =
|
|
321
|
+
[[NSMutableDictionary alloc] init];
|
|
322
|
+
NSMutableArray<MLRNSource *> *hitTouchableSources = [[NSMutableArray alloc] init];
|
|
323
|
+
for (MLRNSource *touchableSource in touchableSources) {
|
|
324
|
+
NSDictionary<NSString *, NSNumber *> *hitbox = touchableSource.hitbox;
|
|
325
|
+
float halfWidth = [hitbox[@"width"] floatValue] / 2.f;
|
|
326
|
+
float halfHeight = [hitbox[@"height"] floatValue] / 2.f;
|
|
327
|
+
|
|
328
|
+
CGFloat top = screenPoint.y - halfHeight;
|
|
329
|
+
CGFloat left = screenPoint.x - halfWidth;
|
|
330
|
+
CGRect hitboxRect =
|
|
331
|
+
CGRectMake(left, top, [hitbox[@"width"] floatValue], [hitbox[@"height"] floatValue]);
|
|
332
|
+
|
|
333
|
+
NSArray<id<MLNFeature>> *features =
|
|
334
|
+
[mapView visibleFeaturesInRect:hitboxRect
|
|
335
|
+
inStyleLayersWithIdentifiers:[NSSet setWithArray:[touchableSource getLayerIDs]]
|
|
336
|
+
predicate:nil];
|
|
337
|
+
|
|
338
|
+
if (features.count > 0) {
|
|
339
|
+
hits[touchableSource.id] = features;
|
|
340
|
+
[hitTouchableSources addObject:touchableSource];
|
|
445
341
|
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (hits.count > 0) {
|
|
345
|
+
MLRNSource *source = [mapView getTouchableSourceWithHighestZIndex:hitTouchableSources];
|
|
346
|
+
if (source != nil && source.hasPressListener) {
|
|
347
|
+
NSArray *geoJSONDicts = [self featuresToJSON:hits[source.id]];
|
|
348
|
+
|
|
349
|
+
NSString *eventType = RCT_MAPBOX_VECTOR_SOURCE_LAYER_PRESS;
|
|
350
|
+
if ([source isKindOfClass:[MLRNShapeSource class]]) {
|
|
351
|
+
eventType = RCT_MAPBOX_SHAPE_SOURCE_LAYER_PRESS;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
CLLocationCoordinate2D coordinate = [mapView convertPoint:screenPoint
|
|
355
|
+
toCoordinateFromView:mapView];
|
|
356
|
+
|
|
357
|
+
MLRNEvent *event =
|
|
358
|
+
[MLRNEvent makeEvent:eventType
|
|
359
|
+
withPayload:@{
|
|
360
|
+
@"features" : geoJSONDicts,
|
|
361
|
+
@"point" : @{
|
|
362
|
+
@"x" : [NSNumber numberWithDouble:screenPoint.x],
|
|
363
|
+
@"y" : [NSNumber numberWithDouble:screenPoint.y]
|
|
364
|
+
},
|
|
365
|
+
@"coordinates" : @{
|
|
366
|
+
@"latitude" : [NSNumber numberWithDouble:coordinate.latitude],
|
|
367
|
+
@"longitude" : [NSNumber numberWithDouble:coordinate.longitude]
|
|
368
|
+
}
|
|
369
|
+
}];
|
|
370
|
+
[self fireEvent:event withCallback:source.onPress];
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (mapView.onPress == nil) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
MLRNMapTouchEvent *event = [MLRNMapTouchEvent makeTapEvent:mapView withPoint:screenPoint];
|
|
380
|
+
[self fireEvent:event withCallback:mapView.onPress];
|
|
446
381
|
}
|
|
447
382
|
|
|
448
|
-
- (
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
383
|
+
- (void)didLongPressMap:(UILongPressGestureRecognizer *)recognizer {
|
|
384
|
+
MLRNMapView *mapView = (MLRNMapView *)recognizer.view;
|
|
385
|
+
|
|
386
|
+
if (mapView == nil || mapView.onPress == nil ||
|
|
387
|
+
recognizer.state != UIGestureRecognizerStateBegan) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
MLRNMapTouchEvent *event =
|
|
392
|
+
[MLRNMapTouchEvent makeLongPressEvent:mapView withPoint:[recognizer locationInView:mapView]];
|
|
393
|
+
[self fireEvent:event withCallback:mapView.onLongPress];
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
#pragma mark - MLNMapViewDelegate
|
|
397
|
+
|
|
398
|
+
- (MLNAnnotationView *)mapView:(MLNMapView *)mapView
|
|
399
|
+
viewForAnnotation:(id<MLNAnnotation>)annotation {
|
|
400
|
+
if ([annotation isKindOfClass:[MLNUserLocation class]] && mapView.userLocation != nil) {
|
|
401
|
+
MLRNMapView *reactMapView = ((MLRNMapView *)mapView);
|
|
402
|
+
if (reactMapView.useNativeUserLocationAnnotationView) {
|
|
403
|
+
return nil;
|
|
452
404
|
}
|
|
453
|
-
return
|
|
405
|
+
return [[MLRNUserLocation sharedInstance] hiddenUserAnnotation];
|
|
406
|
+
} else if ([annotation isKindOfClass:[MLRNPointAnnotation class]]) {
|
|
407
|
+
MLRNPointAnnotation *rctAnnotation = (MLRNPointAnnotation *)annotation;
|
|
408
|
+
return [rctAnnotation getAnnotationView];
|
|
409
|
+
}
|
|
410
|
+
return nil;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
- (void)mapView:(MLNMapView *)mapView
|
|
414
|
+
didChangeUserTrackingMode:(MLNUserTrackingMode)mode
|
|
415
|
+
animated:(BOOL)animated {
|
|
416
|
+
MLRNMapView *reactMapView = ((MLRNMapView *)mapView);
|
|
417
|
+
[reactMapView didChangeUserTrackingMode:mode animated:animated];
|
|
454
418
|
}
|
|
455
419
|
|
|
456
|
-
- (
|
|
457
|
-
{
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
420
|
+
- (void)mapView:(MLNMapView *)mapView didSelectAnnotation:(nonnull id<MLNAnnotation>)annotation {
|
|
421
|
+
if ([annotation isKindOfClass:[MLRNPointAnnotation class]]) {
|
|
422
|
+
MLRNPointAnnotation *rctAnnotation = (MLRNPointAnnotation *)annotation;
|
|
423
|
+
|
|
424
|
+
if (rctAnnotation.onSelected != nil) {
|
|
425
|
+
MLRNMapTouchEvent *event = [MLRNMapTouchEvent makeAnnotationTapEvent:rctAnnotation];
|
|
426
|
+
rctAnnotation.onSelected([event toJSON]);
|
|
461
427
|
}
|
|
462
|
-
|
|
428
|
+
}
|
|
463
429
|
}
|
|
464
430
|
|
|
465
|
-
- (
|
|
466
|
-
{
|
|
467
|
-
|
|
468
|
-
|
|
431
|
+
- (void)mapView:(MLNMapView *)mapView didDeselectAnnotation:(nonnull id<MLNAnnotation>)annotation {
|
|
432
|
+
if ([annotation isKindOfClass:[MLRNPointAnnotation class]]) {
|
|
433
|
+
MLRNPointAnnotation *rctAnnotation = (MLRNPointAnnotation *)annotation;
|
|
434
|
+
|
|
435
|
+
if (rctAnnotation.onDeselected != nil) {
|
|
436
|
+
rctAnnotation.onDeselected(nil);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
469
439
|
}
|
|
470
440
|
|
|
471
|
-
- (
|
|
472
|
-
{
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
441
|
+
- (BOOL)mapView:(MLNMapView *)mapView annotationCanShowCallout:(id<MLNAnnotation>)annotation {
|
|
442
|
+
if ([annotation isKindOfClass:[MLRNPointAnnotation class]]) {
|
|
443
|
+
MLRNPointAnnotation *rctAnnotation = (MLRNPointAnnotation *)annotation;
|
|
444
|
+
return rctAnnotation.calloutView != nil;
|
|
445
|
+
}
|
|
446
|
+
return NO;
|
|
476
447
|
}
|
|
477
448
|
|
|
478
|
-
- (
|
|
479
|
-
{
|
|
480
|
-
|
|
481
|
-
|
|
449
|
+
- (UIView<MLNCalloutView> *)mapView:(MLNMapView *)mapView
|
|
450
|
+
calloutViewForAnnotation:(id<MLNAnnotation>)annotation {
|
|
451
|
+
if ([annotation isKindOfClass:[MLRNPointAnnotation class]]) {
|
|
452
|
+
MLRNPointAnnotation *rctAnnotation = (MLRNPointAnnotation *)annotation;
|
|
453
|
+
return rctAnnotation.calloutView;
|
|
454
|
+
}
|
|
455
|
+
return nil;
|
|
482
456
|
}
|
|
483
457
|
|
|
484
|
-
- (
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
458
|
+
- (BOOL)mapView:(MLNMapView *)mapView
|
|
459
|
+
shouldChangeFromCamera:(MLNMapCamera *)oldCamera
|
|
460
|
+
toCamera:(MLNMapCamera *)newCamera {
|
|
461
|
+
MLRNMapView *reactMapView = ((MLRNMapView *)mapView);
|
|
462
|
+
return MLNCoordinateBoundsIsEmpty(reactMapView.maxBounds) ||
|
|
463
|
+
MLNCoordinateInCoordinateBounds(newCamera.centerCoordinate, reactMapView.maxBounds);
|
|
464
|
+
}
|
|
488
465
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
466
|
+
- (void)mapView:(MLNMapView *)mapView
|
|
467
|
+
regionWillChangeWithReason:(MLNCameraChangeReason)reason
|
|
468
|
+
animated:(BOOL)animated {
|
|
469
|
+
((MLRNMapView *)mapView).isUserInteraction = (BOOL)(reason & ~MLNCameraChangeReasonProgrammatic);
|
|
470
|
+
NSDictionary *payload = [self _makeRegionPayload:mapView animated:animated];
|
|
471
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_REGION_WILL_CHANGE_EVENT andPayload:payload];
|
|
493
472
|
}
|
|
494
473
|
|
|
495
|
-
- (void)
|
|
496
|
-
|
|
497
|
-
|
|
474
|
+
- (void)mapViewRegionIsChanging:(MLNMapView *)mapView {
|
|
475
|
+
NSDictionary *payload = [self _makeRegionPayload:mapView animated:false];
|
|
476
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_REGION_IS_CHANGING andPayload:payload];
|
|
498
477
|
}
|
|
499
478
|
|
|
500
|
-
- (void)
|
|
501
|
-
|
|
502
|
-
|
|
479
|
+
- (void)mapView:(MLNMapView *)mapView
|
|
480
|
+
regionDidChangeWithReason:(MLNCameraChangeReason)reason
|
|
481
|
+
animated:(BOOL)animated {
|
|
482
|
+
if (((reason & MLNCameraChangeReasonTransitionCancelled) ==
|
|
483
|
+
MLNCameraChangeReasonTransitionCancelled) &&
|
|
484
|
+
((reason & MLNCameraChangeReasonGesturePan) != MLNCameraChangeReasonGesturePan))
|
|
485
|
+
return;
|
|
486
|
+
|
|
487
|
+
((MLRNMapView *)mapView).isUserInteraction = (BOOL)(reason & ~MLNCameraChangeReasonProgrammatic);
|
|
488
|
+
|
|
489
|
+
NSDictionary *payload = [self _makeRegionPayload:mapView animated:animated];
|
|
490
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_REGION_DID_CHANGE andPayload:payload];
|
|
503
491
|
}
|
|
504
492
|
|
|
505
|
-
- (void)
|
|
506
|
-
|
|
507
|
-
NSLog(@"Failed loading map %@", error);
|
|
508
|
-
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FAIL_LOADING_MAP];
|
|
493
|
+
- (void)mapViewWillStartLoadingMap:(MLNMapView *)mapView {
|
|
494
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_WILL_START_LOADING_MAP];
|
|
509
495
|
}
|
|
510
496
|
|
|
511
|
-
- (void)
|
|
512
|
-
|
|
513
|
-
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_WILL_START_RENDERING_FRAME];
|
|
497
|
+
- (void)mapViewDidFinishLoadingMap:(MLNMapView *)mapView {
|
|
498
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINISH_LOADING_MAP];
|
|
514
499
|
}
|
|
515
500
|
|
|
516
|
-
- (void)
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINISH_RENDERING_FRAME_FULLY];
|
|
520
|
-
} else {
|
|
521
|
-
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINSIH_RENDERING_FRAME];
|
|
522
|
-
}
|
|
501
|
+
- (void)mapViewDidFailLoadingMap:(MLNMapView *)mapView withError:(NSError *)error {
|
|
502
|
+
NSLog(@"Failed loading map %@", error);
|
|
503
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FAIL_LOADING_MAP];
|
|
523
504
|
}
|
|
524
505
|
|
|
525
|
-
- (void)
|
|
526
|
-
|
|
527
|
-
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_WILL_START_RENDERING_MAP];
|
|
506
|
+
- (void)mapViewWillStartRenderingFrame:(MLNMapView *)mapView {
|
|
507
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_WILL_START_RENDERING_FRAME];
|
|
528
508
|
}
|
|
529
509
|
|
|
530
|
-
- (void)
|
|
531
|
-
{
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
}
|
|
510
|
+
- (void)mapViewDidFinishRenderingFrame:(MLNMapView *)mapView fullyRendered:(BOOL)fullyRendered {
|
|
511
|
+
if (fullyRendered) {
|
|
512
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINISH_RENDERING_FRAME_FULLY];
|
|
513
|
+
} else {
|
|
514
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINSIH_RENDERING_FRAME];
|
|
515
|
+
}
|
|
537
516
|
}
|
|
538
517
|
|
|
539
|
-
- (void)
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
{
|
|
582
|
-
[self reactMapDidChange:mapView eventType:type andPayload:nil];
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
- (void)reactMapDidChange:(MLNMapView*)mapView eventType:(NSString*)type andPayload:(NSDictionary*)payload
|
|
586
|
-
{
|
|
587
|
-
MLRNMapView *reactMapView = (MLRNMapView*)mapView;
|
|
588
|
-
MLRNEvent *event = [MLRNEvent makeEvent:type withPayload:payload];
|
|
589
|
-
[self fireEvent:event withCallback:reactMapView.onMapChange];
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
- (NSDictionary*)_makeRegionPayload:(MLNMapView*)mapView animated:(BOOL)animated
|
|
593
|
-
{
|
|
594
|
-
MLRNMapView *rctMapView = (MLRNMapView *)mapView;
|
|
595
|
-
MLNPointFeature *feature = [[MLNPointFeature alloc] init];
|
|
596
|
-
feature.coordinate = mapView.centerCoordinate;
|
|
597
|
-
feature.attributes = @{
|
|
598
|
-
@"zoomLevel": [NSNumber numberWithDouble:mapView.zoomLevel],
|
|
599
|
-
@"heading": [NSNumber numberWithDouble:mapView.camera.heading],
|
|
600
|
-
@"pitch": [NSNumber numberWithDouble:mapView.camera.pitch],
|
|
601
|
-
@"animated": [NSNumber numberWithBool:animated],
|
|
602
|
-
@"isUserInteraction": @(rctMapView.isUserInteraction),
|
|
603
|
-
@"visibleBounds": [MLRNUtils fromCoordinateBounds:mapView.visibleCoordinateBounds]
|
|
604
|
-
};
|
|
605
|
-
return feature.geoJSONDictionary;
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
- (NSArray<NSDictionary*> *) featuresToJSON:(NSArray<id<MLNFeature>> *) features
|
|
609
|
-
{
|
|
610
|
-
NSMutableArray<NSDictionary*> *json = [[NSMutableArray alloc] init];
|
|
611
|
-
for(id<MLNFeature> feature in features) {
|
|
612
|
-
[json addObject:feature.geoJSONDictionary];
|
|
518
|
+
- (void)mapViewWillStartRenderingMap:(MLNMapView *)mapView {
|
|
519
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_WILL_START_RENDERING_MAP];
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
- (void)mapViewDidFinishRenderingMap:(MLNMapView *)mapView fullyRendered:(BOOL)fullyRendered {
|
|
523
|
+
if (fullyRendered) {
|
|
524
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINISH_RENDERING_MAP_FULLY];
|
|
525
|
+
} else {
|
|
526
|
+
[self reactMapDidChange:mapView eventType:RCT_MAPBOX_DID_FINISH_RENDERING_MAP];
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
- (void)mapView:(MLNMapView *)mapView didFinishLoadingStyle:(MLNStyle *)style {
|
|
531
|
+
MLRNMapView *reactMapView = (MLRNMapView *)mapView;
|
|
532
|
+
if (reactMapView.reactLocalizeLabels == true) {
|
|
533
|
+
[style localizeLabelsIntoLocale:nil];
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
for (int i = 0; i < reactMapView.sources.count; i++) {
|
|
537
|
+
MLRNSource *source = reactMapView.sources[i];
|
|
538
|
+
source.map = reactMapView;
|
|
539
|
+
}
|
|
540
|
+
for (int i = 0; i < reactMapView.layers.count; i++) {
|
|
541
|
+
MLRNLayer *layer = reactMapView.layers[i];
|
|
542
|
+
layer.map = reactMapView;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
if (reactMapView.light != nil) {
|
|
546
|
+
reactMapView.light.map = reactMapView;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
[reactMapView notifyStyleLoaded];
|
|
550
|
+
[self reactMapDidChange:reactMapView eventType:RCT_MAPBOX_DID_FINISH_LOADING_STYLE];
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
- (UIImage *)mapView:(MLNMapView *)mapView didFailToLoadImage:(NSString *)imageName {
|
|
554
|
+
MLRNMapView *reactMapView = ((MLRNMapView *)mapView);
|
|
555
|
+
NSArray<MLRNImages *> *allImages = [reactMapView getAllImages];
|
|
556
|
+
for (MLRNImages *images in allImages) {
|
|
557
|
+
if ([images addMissingImageToStyle:imageName]) {
|
|
558
|
+
// The image was added inside addMissingImageToStyle so we can return nil
|
|
559
|
+
return nil;
|
|
613
560
|
}
|
|
614
|
-
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
for (MLRNImages *images in allImages) {
|
|
564
|
+
[images sendImageMissingEvent:imageName];
|
|
565
|
+
}
|
|
566
|
+
return nil;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
- (void)reactMapDidChange:(MLNMapView *)mapView eventType:(NSString *)type {
|
|
570
|
+
[self reactMapDidChange:mapView eventType:type andPayload:nil];
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
- (void)reactMapDidChange:(MLNMapView *)mapView
|
|
574
|
+
eventType:(NSString *)type
|
|
575
|
+
andPayload:(NSDictionary *)payload {
|
|
576
|
+
MLRNMapView *reactMapView = (MLRNMapView *)mapView;
|
|
577
|
+
MLRNEvent *event = [MLRNEvent makeEvent:type withPayload:payload];
|
|
578
|
+
[self fireEvent:event withCallback:reactMapView.onMapChange];
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
- (NSDictionary *)_makeRegionPayload:(MLNMapView *)mapView animated:(BOOL)animated {
|
|
582
|
+
MLRNMapView *rctMapView = (MLRNMapView *)mapView;
|
|
583
|
+
MLNPointFeature *feature = [[MLNPointFeature alloc] init];
|
|
584
|
+
feature.coordinate = mapView.centerCoordinate;
|
|
585
|
+
feature.attributes = @{
|
|
586
|
+
@"zoomLevel" : [NSNumber numberWithDouble:mapView.zoomLevel],
|
|
587
|
+
@"heading" : [NSNumber numberWithDouble:mapView.camera.heading],
|
|
588
|
+
@"pitch" : [NSNumber numberWithDouble:mapView.camera.pitch],
|
|
589
|
+
@"animated" : [NSNumber numberWithBool:animated],
|
|
590
|
+
@"isUserInteraction" : @(rctMapView.isUserInteraction),
|
|
591
|
+
@"visibleBounds" : [MLRNUtils fromCoordinateBounds:mapView.visibleCoordinateBounds]
|
|
592
|
+
};
|
|
593
|
+
return feature.geoJSONDictionary;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
- (NSArray<NSDictionary *> *)featuresToJSON:(NSArray<id<MLNFeature>> *)features {
|
|
597
|
+
NSMutableArray<NSDictionary *> *json = [[NSMutableArray alloc] init];
|
|
598
|
+
for (id<MLNFeature> feature in features) {
|
|
599
|
+
[json addObject:feature.geoJSONDictionary];
|
|
600
|
+
}
|
|
601
|
+
return json;
|
|
615
602
|
}
|
|
616
603
|
|
|
617
604
|
@end
|