diff --git a/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapView.java b/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapView.java index c753f12..c9b6e85 100644 --- a/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapView.java +++ b/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapView.java @@ -13,6 +13,7 @@ import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.MapboxMapOptions; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.mapboxsdk.maps.UiSettings; import com.mapbox.services.commons.geojson.Point; import mapbox.rctmgl.utils.MGLGeoUtils; @@ -32,10 +33,17 @@ public class RCTMGLMapView extends RelativeLayout implements OnMapReadyCallback private MapView mMapView; private String mStyleURL; + private boolean mAnimated; + private boolean mScrollEnabled; + private boolean mPitchEnabled; + private double mHeading; private double mPitch; private double mZoomLevel; + private double mMinZoomLevel; + private double mMaxZoomLevel; + private Point mCenterCoordinate; public RCTMGLMapView(Context context, RCTMGLMapViewManager manager) { @@ -50,6 +58,7 @@ public class RCTMGLMapView extends RelativeLayout implements OnMapReadyCallback return; } mMap = mapboxMap; + updateUISettings(); setOnClickListener(); setOnLongClickListener(); } @@ -67,6 +76,16 @@ public class RCTMGLMapView extends RelativeLayout implements OnMapReadyCallback updateCameraPositionIfNeeded(false); } + public void setScrollEnabled(boolean scrollEnabled) { + mScrollEnabled = scrollEnabled; + updateUISettings(); + } + + public void setPitchEnabled(boolean pitchEnabled) { + mPitchEnabled = pitchEnabled; + updateUISettings(); + } + public void setHeading(double heading) { mHeading = heading; updateCameraPositionIfNeeded(false); @@ -82,6 +101,16 @@ public class RCTMGLMapView extends RelativeLayout implements OnMapReadyCallback updateCameraPositionIfNeeded(false); } + public void setMinZoomLevel(double minZoomLevel) { + mMinZoomLevel = minZoomLevel; + mMap.setMinZoomPreference(mMinZoomLevel); + } + + public void setMaxZoomLevel(double maxZoomLevel) { + mMaxZoomLevel = maxZoomLevel; + mMap.setMaxZoomPreference(mMaxZoomLevel); + } + public void setCenterCoordinate(Point centerCoordinate) { mCenterCoordinate = centerCoordinate; updateCameraPositionIfNeeded(true); @@ -160,4 +189,13 @@ public class RCTMGLMapView extends RelativeLayout implements OnMapReadyCallback } }); } + + private void updateUISettings() { + if (mMap == null) { + return; + } + UiSettings uiSettings = mMap.getUiSettings(); + uiSettings.setScrollGesturesEnabled(mScrollEnabled); + uiSettings.setTiltGesturesEnabled(mPitchEnabled); + } } diff --git a/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapViewManager.java b/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapViewManager.java index b606cbb..90144fa 100644 --- a/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapViewManager.java +++ b/android/rctmgl/src/main/java/mapbox/rctmgl/components/RCTMGLMapViewManager.java @@ -57,6 +57,16 @@ public class RCTMGLMapViewManager extends RCTAbstractEventEmitter mapView.setAnimated(isAnimated); } + @ReactProp(name="scrollEnabled") + public void setScrollEnabled(RCTMGLMapView mapView, boolean scrollEnabled) { + mapView.setScrollEnabled(scrollEnabled); + } + + @ReactProp(name="pitchEnabled") + public void setPitchEnabled(RCTMGLMapView mapView, boolean pitchEnabled) { + mapView.setPitchEnabled(pitchEnabled); + } + @ReactProp(name="heading") public void setHeading(RCTMGLMapView mapView, double heading) { mapView.setHeading(heading); @@ -72,6 +82,16 @@ public class RCTMGLMapViewManager extends RCTAbstractEventEmitter mapView.setZoomLevel(zoomLevel); } + @ReactProp(name="minZoomLevel") + public void setMinZoomLevel(RCTMGLMapView mapView, double minZoomLevel) { + mapView.setMinZoomLevel(minZoomLevel); + } + + @ReactProp(name="maxZoomLevel") + public void setMaxZoomLevel(RCTMGLMapView mapView, double maxZoomLevel) { + mapView.setMaxZoomLevel(maxZoomLevel); + } + @ReactProp(name="centerCoordinate") public void setCenterCoordinate(RCTMGLMapView mapView, ReadableMap map) { Point centerCoordinate = MGLGeoUtils.readableMapToPoint(map); diff --git a/docs/MapView.md b/docs/MapView.md index 935d0f1..f733a81 100644 --- a/docs/MapView.md +++ b/docs/MapView.md @@ -12,6 +12,10 @@ | style | `any` | `none` | `false` | Style for wrapping React Native View | | styleURL | `string` | `MapView.StyleURL.Street` | `false` | Style URL for map | | zoomLevel | `number` | `16` | `false` | Initial zoom level of map | +| minZoomLevel | `number` | `none` | `false` | Min zoom level of map | +| maxZoomLevel | `number` | `none` | `false` | Max zoom level of map | +| scrollEnabled | `bool` | `none` | `false` | Enable/Disable scroll on the map | +| pitchEnabled | `bool` | `none` | `false` | Enable/Disable pitch on map | | onPress | `func` | `none` | `false` | Map press listener, gets called when a user presses the map | | onLongPress | `func` | `none` | `false` | Map long press listener, gets called when a user long presses the map | diff --git a/docs/docs.json b/docs/docs.json index c01c442..da3f084 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -101,6 +101,34 @@ "computed": false } }, + "minZoomLevel": { + "type": { + "name": "number" + }, + "required": false, + "description": "Min zoom level of map" + }, + "maxZoomLevel": { + "type": { + "name": "number" + }, + "required": false, + "description": "Max zoom level of map" + }, + "scrollEnabled": { + "type": { + "name": "bool" + }, + "required": false, + "description": "Enable/Disable scroll on the map" + }, + "pitchEnabled": { + "type": { + "name": "bool" + }, + "required": false, + "description": "Enable/Disable pitch on map" + }, "onPress": { "type": { "name": "func" diff --git a/ios/RCTMGL/RCTMGLMapView.h b/ios/RCTMGL/RCTMGLMapView.h index 9bdc03d..45035c9 100644 --- a/ios/RCTMGL/RCTMGLMapView.h +++ b/ios/RCTMGL/RCTMGLMapView.h @@ -12,12 +12,18 @@ @interface RCTMGLMapView : MGLMapView @property (nonatomic, assign) BOOL animated; +@property (nonatomic, assign) BOOL reactScrollEnabled; +@property (nonatomic, assign) BOOL reactPitchEnabled; + @property (nonatomic, assign) NSDictionary *reactCenterCoordinate; @property (nonatomic, assign) NSString *reactStyleURL; @property (nonatomic, assign) double heading; @property (nonatomic, assign) double pitch; @property (nonatomic, assign) double reactZoomLevel; +@property (nonatomic, assign) double reactMinZoomLevel; +@property (nonatomic, assign) double reactMaxZoomLevel; + @property (nonatomic, copy) RCTBubblingEventBlock onPress; @property (nonatomic, copy) RCTBubblingEventBlock onLongPress; diff --git a/ios/RCTMGL/RCTMGLMapView.m b/ios/RCTMGL/RCTMGLMapView.m index 81172b2..18a6f13 100644 --- a/ios/RCTMGL/RCTMGLMapView.m +++ b/ios/RCTMGL/RCTMGLMapView.m @@ -34,6 +34,18 @@ _animated = animated; } +- (void)setReactScrollEnabled:(BOOL)reactScrollEnabled +{ + _reactScrollEnabled = reactScrollEnabled; + self.scrollEnabled = _reactScrollEnabled; +} + +- (void)setReactPitchEnabled:(BOOL)reactPitchEnabled +{ + _reactPitchEnabled = reactPitchEnabled; + self.pitchEnabled = _reactPitchEnabled; +} + - (void)setReactCenterCoordinate:(NSDictionary *)reactCenterCoordinate { _reactCenterCoordinate = reactCenterCoordinate; @@ -68,6 +80,18 @@ self.zoomLevel = reactZoomLevel; } +- (void)setReactMinZoomLevel:(double)reactMinZoomLevel +{ + _reactMinZoomLevel = reactMinZoomLevel; + self.minimumZoomLevel = _reactMinZoomLevel; +} + +- (void)setReactMaxZoomLevel:(double)reactMaxZoomLevel +{ + _reactMaxZoomLevel = reactMaxZoomLevel; + self.maximumZoomLevel = reactMaxZoomLevel; +} + - (void)setOnPress:(RCTBubblingEventBlock)onPress { _onPress = onPress; diff --git a/ios/RCTMGL/RCTMGLMapViewManager.m b/ios/RCTMGL/RCTMGLMapViewManager.m index f40c4d4..068ac69 100644 --- a/ios/RCTMGL/RCTMGLMapViewManager.m +++ b/ios/RCTMGL/RCTMGLMapViewManager.m @@ -32,11 +32,17 @@ RCT_EXPORT_MODULE() } RCT_EXPORT_VIEW_PROPERTY(animated, BOOL) +RCT_REMAP_VIEW_PROPERTY(scrollEnabled, reactScrollEnabled, BOOL) +RCT_REMAP_VIEW_PROPERTY(pitchEnabled, reactPitchEnabled, BOOL) + RCT_REMAP_VIEW_PROPERTY(centerCoordinate, reactCenterCoordinate, NSDictionary) RCT_REMAP_VIEW_PROPERTY(styleURL, reactStyleURL, NSString) + RCT_EXPORT_VIEW_PROPERTY(heading, double) RCT_EXPORT_VIEW_PROPERTY(pitch, double) RCT_REMAP_VIEW_PROPERTY(zoomLevel, reactZoomLevel, double) +RCT_REMAP_VIEW_PROPERTY(minZoomLevel, reactMinZoomLevel, double) +RCT_REMAP_VIEW_PROPERTY(maxZoomLevel, reactMaxZoomLevel, double) RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock) RCT_EXPORT_VIEW_PROPERTY(onLongPress, RCTBubblingEventBlock) @@ -48,7 +54,7 @@ RCT_EXPORT_VIEW_PROPERTY(onLongPress, RCTBubblingEventBlock) if (mapView == nil || mapView.onPress == nil) { return; } - + mapView.onPress([self convertXYPointToGeoJSONPoint:mapView atPoint:[recognizer locationInView:mapView]]); } diff --git a/javascript/components/MapView.js b/javascript/components/MapView.js index 8bb4c37..5ea8fdb 100644 --- a/javascript/components/MapView.js +++ b/javascript/components/MapView.js @@ -57,6 +57,26 @@ class MapView extends React.Component { */ zoomLevel: PropTypes.number, + /** + * Min zoom level of map + */ + minZoomLevel: PropTypes.number, + + /** + * Max zoom level of map + */ + maxZoomLevel: PropTypes.number, + + /** + * Enable/Disable scroll on the map + */ + scrollEnabled: PropTypes.bool, + + /** + * Enable/Disable pitch on map + */ + pitchEnabled: PropTypes.bool, + /** * Map press listener, gets called when a user presses the map */ @@ -65,7 +85,7 @@ class MapView extends React.Component { /** * Map long press listener, gets called when a user long presses the map */ - onLongPress: PropTypes.func, + onLongPress: PropTypes.func, }; static defaultProps = { @@ -100,6 +120,8 @@ class MapView extends React.Component { return ( );