// // AMapPolylineController.m // amap_flutter_map // // Created by lly on 2020/11/6. // #import "AMapPolylineController.h" #import "AMapPolyline.h" #import "AMapJsonUtils.h" #import "AMapMarker.h" #import "MAPolyline+Flutter.h" #import "MAPolylineRenderer+Flutter.h" #import "AMapConvertUtil.h" #import "FlutterMethodChannel+MethodCallDispatch.h" @interface AMapPolylineController () @property (nonatomic,strong) NSMutableDictionary *polylineDict; @property (nonatomic,strong) FlutterMethodChannel *methodChannel; @property (nonatomic,strong) NSObject *registrar; @property (nonatomic,strong) MAMapView *mapView; @end @implementation AMapPolylineController - (instancetype)init:(FlutterMethodChannel*)methodChannel mapView:(MAMapView*)mapView registrar:(NSObject*)registrar { self = [super init]; if (self) { _methodChannel = methodChannel; _mapView = mapView; _polylineDict = [NSMutableDictionary dictionaryWithCapacity:1]; _registrar = registrar; __weak typeof(self) weakSelf = self; [_methodChannel addMethodName:@"polylines#update" withHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) { id polylinesToAdd = call.arguments[@"polylinesToAdd"]; if ([polylinesToAdd isKindOfClass:[NSArray class]]) { [weakSelf addPolylines:polylinesToAdd]; } id polylinesToChange = call.arguments[@"polylinesToChange"]; if ([polylinesToChange isKindOfClass:[NSArray class]]) { [weakSelf changePolylines:polylinesToChange]; } id polylineIdsToRemove = call.arguments[@"polylineIdsToRemove"]; if ([polylineIdsToRemove isKindOfClass:[NSArray class]]) { [weakSelf removePolylineIds:polylineIdsToRemove]; } result(nil); }]; } return self; } - (nullable AMapPolyline *)polylineForId:(NSString *)polylineId { return _polylineDict[polylineId]; } - (void)addPolylines:(NSArray*)polylinesToAdd { for (NSDictionary* polyline in polylinesToAdd) { AMapPolyline *polylineModel = [AMapJsonUtils modelFromDict:polyline modelClass:[AMapPolyline class]]; if (polylineModel.customTexture) { polylineModel.strokeImage = [AMapConvertUtil imageFromRegistrar:self.registrar iconData:polylineModel.customTexture]; } // 先加入到字段中,避免后续的地图回到里,取不到对应的overlay数据 if (polylineModel.id_) { _polylineDict[polylineModel.id_] = polylineModel; } [self.mapView addOverlay:polylineModel.polyline]; } } - (void)changePolylines:(NSArray*)polylinesToChange { for (NSDictionary* polylineToChange in polylinesToChange) { AMapPolyline *polyline = [AMapJsonUtils modelFromDict:polylineToChange modelClass:[AMapPolyline class]]; AMapPolyline *currentPolyline = _polylineDict[polyline.id_]; NSAssert(currentPolyline != nil, @"需要修改的Polyline不存在"); // 如果图片纹理变了,则存储和解析新的图标 if ([AMapConvertUtil checkIconDescriptionChangedFrom:currentPolyline.customTexture to:polyline.customTexture]) { currentPolyline.strokeImage = [AMapConvertUtil imageFromRegistrar:self.registrar iconData:polyline.customTexture]; currentPolyline.customTexture = polyline.customTexture; } //更新除了图标之外的其它信息 [currentPolyline updatePolyline:polyline]; MAOverlayRenderer *render = [self.mapView rendererForOverlay:currentPolyline.polyline]; if (render && [render isKindOfClass:[MAPolylineRenderer class]]) { // render没有复用,只要添加过,就一定可以获取到 [(MAPolylineRenderer *)render updateRenderWithPolyline:currentPolyline]; } } } - (void)removePolylineIds:(NSArray*)polylineIdsToRemove { for (NSString* polylineId in polylineIdsToRemove) { if (!polylineId) { continue; } AMapPolyline* polyline = _polylineDict[polylineId]; if (!polyline) { continue; } [self.mapView removeOverlay:polyline.polyline]; [_polylineDict removeObjectForKey:polylineId]; } } //MARK: Marker的回调 - (BOOL)onPolylineTap:(NSString*)polylineId { if (!polylineId) { return NO; } AMapPolyline* polyline = _polylineDict[polylineId]; if (!polyline) { return NO; } [_methodChannel invokeMethod:@"polyline#onTap" arguments:@{@"polylineId" : polylineId}]; return YES; } @end