@@ -71,9 +71,9 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
7171 longPress. require ( toFail: recognizer)
7272 }
7373 var longPressRecognizerAdded = false
74-
74+
7575 if let args = args as? [ String : Any ] {
76-
76+
7777 Convert . interpretMapLibreMapOptions ( options: args [ " options " ] , delegate: self )
7878 if let initialCameraPosition = args [ " initialCameraPosition " ] as? [ String : Any ] ,
7979 let camera = MLNMapCamera . fromDict ( initialCameraPosition, mapView: mapView) ,
@@ -158,6 +158,15 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
158158 result ( nil )
159159 }
160160 }
161+ case " map#clearAmbientCache " :
162+ MLNOfflineStorage . shared. clearAmbientCache {
163+ error in
164+ if let error = error {
165+ result ( error)
166+ } else {
167+ result ( nil )
168+ }
169+ }
161170 case " map#updateMyLocationTrackingMode " :
162171 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
163172 if let myLocationTrackingMode = arguments [ " mode " ] as? UInt ,
@@ -170,7 +179,7 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
170179 if let langStr = Locale . current. languageCode {
171180 setMapLanguage ( language: langStr)
172181 }
173-
182+
174183 result ( nil )
175184 case " map#updateContentInsets " :
176185 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
@@ -316,7 +325,7 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
316325 case " camera#move " :
317326 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
318327 guard let cameraUpdate = arguments [ " cameraUpdate " ] as? [ Any ] else { return }
319-
328+
320329 if let camera = Convert . parseCameraUpdate ( cameraUpdate: cameraUpdate, mapView: mapView) {
321330 mapView. setCamera ( camera, animated: false )
322331 }
@@ -325,12 +334,12 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
325334 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
326335 guard let cameraUpdate = arguments [ " cameraUpdate " ] as? [ Any ] else { return }
327336 guard let camera = Convert . parseCameraUpdate ( cameraUpdate: cameraUpdate, mapView: mapView) else { return }
328-
329-
337+
338+
330339 let completion = {
331340 result ( nil )
332341 }
333-
342+
334343 if let duration = arguments [ " duration " ] as? TimeInterval {
335344 if let padding = Convert . parseLatLngBoundsPadding ( cameraUpdate) {
336345 mapView. fly ( to: camera, edgePadding: padding, withDuration: duration / 1000 , completionHandler: completion)
@@ -537,7 +546,7 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
537546 properties: properties
538547 )
539548 result ( nil )
540-
549+
541550 case " heatmapLayer#add " :
542551 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
543552 guard let sourceId = arguments [ " sourceId " ] as? String else { return }
@@ -840,11 +849,11 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
840849 }
841850 layer. isVisible = visible
842851 result ( nil )
843-
852+
844853 case " map#querySourceFeatures " :
845854 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
846855 guard let sourceId = arguments [ " sourceId " ] as? String else { return }
847-
856+
848857 var sourceLayerId = Set < String > ( )
849858 if let layerId = arguments [ " sourceLayerId " ] as? String {
850859 sourceLayerId. insert ( layerId)
@@ -853,10 +862,10 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
853862 if let filter = arguments [ " filter " ] as? [ Any ] {
854863 filterExpression = NSPredicate ( mglJSONObject: filter)
855864 }
856-
865+
857866 var reply = [ String: NSObject] ( )
858867 var features : [ MLNFeature ] = [ ]
859-
868+
860869 guard let style = mapView. style else { return }
861870 if let source = style. source ( withIdentifier: sourceId) {
862871 if let vectorSource = source as? MLNVectorTileSource {
@@ -865,7 +874,7 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
865874 features = shapeSource. features ( matching: filterExpression)
866875 }
867876 }
868-
877+
869878 var featuresJson = [ String] ( )
870879 for feature in features {
871880 let dictionary = feature. geoJSONDictionary ( )
@@ -883,11 +892,11 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
883892
884893 case " style#getLayerIds " :
885894 var layerIds = [ String] ( )
886-
895+
887896 guard let style = mapView. style else { return }
888-
897+
889898 style. layers. forEach { layer in layerIds. append ( layer. identifier) }
890-
899+
891900 var reply = [ String: NSObject] ( )
892901 reply [ " layers " ] = layerIds as NSObject
893902 result ( reply)
@@ -902,18 +911,18 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
902911 var reply = [ String: NSObject] ( )
903912 reply [ " sources " ] = sourceIds as NSObject
904913 result ( reply)
905-
914+
906915 case " style#getFilter " :
907916 guard let arguments = methodCall. arguments as? [ String : Any ] else { return }
908917 guard let layerId = arguments [ " layerId " ] as? String else { return }
909-
918+
910919 guard let style = mapView. style else { return }
911920 guard let layer = style. layer ( withIdentifier: layerId) else { return }
912-
921+
913922 var currentLayerFilter : String = " "
914923 if let vectorLayer = layer as? MLNVectorStyleLayer {
915924 if let layerFilter = vectorLayer. predicate {
916-
925+
917926 let jsonExpression = layerFilter. mgl_jsonExpressionObject
918927 if let data = try ? JSONSerialization . data ( withJSONObject: jsonExpression, options: [ ] ) {
919928 currentLayerFilter = String ( data: data, encoding: String . Encoding. utf8) ?? " "
@@ -925,11 +934,11 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
925934 ) . flutterError)
926935 return ;
927936 }
928-
937+
929938 var reply = [ String: NSObject] ( )
930939 reply [ " filter " ] = currentLayerFilter as NSObject
931940 result ( reply)
932-
941+
933942 default :
934943 result ( FlutterMethodNotImplemented)
935944 }
@@ -967,16 +976,16 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
967976 private func getCamera( ) -> MLNMapCamera ? {
968977 return trackCameraPosition ? mapView. camera : nil
969978 }
970-
979+
971980 private func setMapLanguage( language: String ) {
972981 self . mapView. setMapLanguage ( language)
973982 }
974983
975984 /*
976985 * Scan layers from top to bottom and return the first matching feature
977986 */
978- private func firstFeatureOnLayers( at: CGPoint ) -> MLNFeature ? {
979- guard let style = mapView. style else { return nil }
987+ private func firstFeatureOnLayers( at: CGPoint ) -> ( feature : MLNFeature ? , layerId : String ? ) {
988+ guard let style = mapView. style else { return ( nil , nil ) }
980989
981990 // get layers in order (interactiveFeatureLayerIds is unordered)
982991 let clickableLayers = style. layers. filter { layer in
@@ -989,10 +998,10 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
989998 styleLayerIdentifiers: [ layer. identifier]
990999 )
9911000 if let feature = features. first {
992- return feature
1001+ return ( feature, layer . identifier )
9931002 }
9941003 }
995- return nil
1004+ return ( nil , nil )
9961005 }
9971006
9981007 /*
@@ -1004,13 +1013,15 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
10041013 let point = sender. location ( in: mapView)
10051014 let coordinate = mapView. convert ( point, toCoordinateFrom: mapView)
10061015
1007- if let feature = firstFeatureOnLayers ( at: point) {
1016+ let result = firstFeatureOnLayers ( at: point)
1017+ if let feature = result. feature {
10081018 channel? . invokeMethod ( " feature#onTap " , arguments: [
10091019 " id " : feature. identifier,
10101020 " x " : point. x,
10111021 " y " : point. y,
10121022 " lng " : coordinate. longitude,
10131023 " lat " : coordinate. latitude,
1024+ " layerId " : result. layerId,
10141025 ] )
10151026 } else {
10161027 channel? . invokeMethod ( " map#onMapClick " , arguments: [
@@ -1053,22 +1064,23 @@ class MapLibreMapController: NSObject, FlutterPlatformView, MLNMapViewDelegate,
10531064 let point = sender. location ( in: mapView)
10541065 let coordinate = mapView. convert ( point, toCoordinateFrom: mapView)
10551066
1056- if dragFeature == nil , began, sender. numberOfTouches == 1 ,
1057- let feature = firstFeatureOnLayers ( at: point) ,
1058- let draggable = feature. attribute ( forKey: " draggable " ) as? Bool ,
1059- draggable
1060- {
1061- sender. state = UIGestureRecognizer . State. began
1062- dragFeature = feature
1063- originDragCoordinate = coordinate
1064- previousDragCoordinate = coordinate
1065- mapView. allowsScrolling = false
1066- let eventType = " start "
1067- invokeFeatureDrag ( point, coordinate, eventType)
1068- for gestureRecognizer in mapView. gestureRecognizers! {
1069- if let _ = gestureRecognizer as? UIPanGestureRecognizer {
1070- gestureRecognizer. addTarget ( self , action: #selector( handleMapPan) )
1071- break
1067+ if dragFeature == nil , began, sender. numberOfTouches == 1 {
1068+ let result = firstFeatureOnLayers ( at: point)
1069+ if let feature = result. feature,
1070+ let draggable = feature. attribute ( forKey: " draggable " ) as? Bool ,
1071+ draggable {
1072+ sender. state = UIGestureRecognizer . State. began
1073+ dragFeature = feature
1074+ originDragCoordinate = coordinate
1075+ previousDragCoordinate = coordinate
1076+ mapView. allowsScrolling = false
1077+ let eventType = " start "
1078+ invokeFeatureDrag ( point, coordinate, eventType)
1079+ for gestureRecognizer in mapView. gestureRecognizers! {
1080+ if let _ = gestureRecognizer as? UIPanGestureRecognizer {
1081+ gestureRecognizer. addTarget ( self , action: #selector( handleMapPan) )
1082+ break
1083+ }
10721084 }
10731085 }
10741086 }
0 commit comments