You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
9.9 KiB
Objective-C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//
// BMFMapView.m
// flutter_bmfmap
//
// Created by zbj on 2020/2/10.
//
#import "BMFMapView.h"
#import "BMFMapModels.h"
#import "BMFEdgeInsets.h"
@interface BMFMapView ()
/// map属性集合
@property (nonatomic, strong) NSDictionary *mapViewOptions;
@end
@implementation BMFMapView
+ (instancetype)viewWithFrame:(CGRect)frame {
return [[BMFMapView alloc] initWithFrame:frame];
}
+ (instancetype)viewWithFrame:(CGRect)frame dic:(NSDictionary *)dic{
BMFMapView *map = [[BMFMapView alloc] initWithFrame:frame];
map.mapViewOptions = dic;
[map updateMapViewWith:dic];
return map;
}
// 此方法解决初始时设置的属性不生效问题
- (BOOL)updateMapOptions {
if (_mapViewOptions) {
// logo位置 默认BMKLogoPositionLeftBottom
if ([_mapViewOptions[@"logoPosition"] isValidParam]) {
self.logoPosition = [_mapViewOptions[@"logoPosition"] intValue];
}
// 指南针的位置设定坐标以BMKMapView左上角为原点向右向下增长
if ([_mapViewOptions[@"compassPosition"] isValidParam]) {
BMFMapPoint *point = [BMFMapPoint bmf_modelWith:_mapViewOptions[@"compassPosition"]];
self.compassPosition = [point toCGPoint];
}
// 设定地图是否打开百度城市热力图图层(百度自有数据)
if ([_mapViewOptions[@"baiduHeatMapEnabled"] isValidParam]) {
self.baiduHeatMapEnabled = [_mapViewOptions[@"baiduHeatMapEnabled"] boolValue];
}
// 设定是否显式比例尺
if ([_mapViewOptions[@"showMapScaleBar"] isValidParam]) {
self.showMapScaleBar = [_mapViewOptions[@"showMapScaleBar"] boolValue];
}
// 比例尺的位置设定坐标以BMKMapView左上角为原点向右向下增长
if ([_mapViewOptions[@"mapScaleBarPosition"] isValidParam]) {
self.mapScaleBarPosition = [[BMFMapPoint bmf_modelWith:_mapViewOptions[@"mapScaleBarPosition"]] toCGPoint];
}
return YES;
}
return NO;
}
- (BOOL)updateMapViewWith:(NSDictionary *)dic {
BOOL result = NO;
if (dic) {
// 当前地图类型,可设定为标准地图、卫星地图
if ([dic[@"mapType"] isValidParam]) {
self.mapType = [dic[@"mapType"] intValue];
}
// 限制地图的显示范围(地图状态改变时,该范围不会在地图显示范围外。设置成功后,会调整地图显示该范围)
if ([dic[@"limitMapBounds"] isValidParam]) {
BMFCoordinateBounds *limitMapBounds = [BMFCoordinateBounds bmf_modelWith:dic[@"limitMapBounds"]];
self.limitMapRegion = [limitMapBounds toCoordinateRegion];
}
// logo位置 默认BMKLogoPositionLeftBottom
if ([_mapViewOptions[@"logoPosition"] isValidParam]) {
self.logoPosition = [dic[@"logoPosition"] intValue];
}
// 指南针的位置设定坐标以BMKMapView左上角为原点向右向下增长
if ([dic[@"compassPosition"] isValidParam]) {
BMFMapPoint *point = [BMFMapPoint bmf_modelWith:dic[@"compassPosition"]];
self.compassPosition = [point toCGPoint];
}
// 当前地图的中心点,改变该值时,地图的比例尺级别不会发生变化
if ([dic[@"center"] isValidParam]) {
BMFCoordinate *coord = [BMFCoordinate bmf_modelWith:dic[@"center"]];
[self setCenterCoordinate:[coord toCLLocationCoordinate2D]];
}
// 地图比例尺级别在手机上当前可使用的级别为4-21级
if ([dic[@"zoomLevel"] isValidParam]) {
self.zoomLevel = [dic[@"zoomLevel"] intValue];
}
// 地图的自定义最大比例尺级别
if ([dic[@"minZoomLevel"] isValidParam]) {
self.minZoomLevel = [dic[@"minZoomLevel"] intValue];
}
// 地图的自定义最大比例尺级别
if ([dic[@"maxZoomLevel"] isValidParam]) {
self.maxZoomLevel = [dic[@"maxZoomLevel"] intValue];
}
// 地图旋转角度在手机上当前可使用的范围为180180度
if ([dic[@"rotation"] isValidParam]) {
self.rotation = [dic[@"rotation"] intValue];
}
// 地图俯视角度在手机上当前可使用的范围为450度
if ([dic[@"overlooking"] isValidParam]) {
self.overlooking = [dic[@"overlooking"] intValue];
}
// 地图俯视角度最小值(即角度最大值),在手机上当前可设置的范围为-790度
if ([dic[@"minOverlooking"] isValidParam]) {
self.minOverlooking = [dic[@"minOverlooking"] intValue];
}
// 设定地图是否现显示3D楼块效果
if ([dic[@"buildingsEnabled"] isValidParam]) {
self.buildingsEnabled = [dic[@"buildingsEnabled"] boolValue];
[self setMapStatus:[self getMapStatus]];
}
// 设定地图是否显示底图poi标注(不包含室内图标注)默认YES
if ([dic[@"showMapPoi"] isValidParam]) {
self.showMapPoi = [dic[@"showMapPoi"] boolValue];
}
// 设定地图是否打开路况图层
if ([dic[@"trafficEnabled"] isValidParam]) {
self.trafficEnabled = [dic[@"trafficEnabled"] boolValue];
}
// 设定地图是否打开百度城市热力图图层(百度自有数据)
if ([dic[@"baiduHeatMapEnabled"] isValidParam]) {
self.baiduHeatMapEnabled = [dic[@"baiduHeatMapEnabled"] boolValue];
}
// 设定地图View能否支持所有手势操作
if ([dic[@"gesturesEnabled"] isValidParam]) {
self.gesturesEnabled = [dic[@"gesturesEnabled"] boolValue];
}
// 设定地图View能否支持用户多点缩放(双指)
if ([dic[@"zoomEnabled"] isValidParam]) {
self.zoomEnabled = [dic[@"zoomEnabled"] boolValue];
}
// 设定地图View能否支持用户缩放(双击或双指单击)
if ([dic[@"zoomEnabledWithTap"] isValidParam]) {
self.zoomEnabledWithTap = [dic[@"zoomEnabledWithTap"] boolValue];
}
// 设定地图View能否支持用户移动地图
if ([dic[@"scrollEnabled"] isValidParam]) {
self.scrollEnabled = [dic[@"scrollEnabled"] boolValue];
}
// 设定地图View能否支持俯仰角
if ([dic[@"overlookEnabled"] isValidParam]) {
self.overlookEnabled = [dic[@"overlookEnabled"] boolValue];
}
// 设定地图View能否支持旋转
if ([dic[@"rotateEnabled"] isValidParam]) {
self.rotateEnabled = [dic[@"rotateEnabled"] boolValue];
}
// 设定地图是否回调force touch事件默认为NO仅适用于支持3D Touch的情况
// 开启后会回调 - mapview:onForceTouch:force:maximumPossibleForce:
if ([dic[@"forceTouchEnabled"] isValidParam]) {
self.forceTouchEnabled = [dic[@"forceTouchEnabled"] boolValue];
}
// 设定是否显式比例尺
if ([dic[@"showMapScaleBar"] isValidParam]) {
self.showMapScaleBar = [dic[@"showMapScaleBar"] boolValue];
}
// 比例尺的位置设定坐标以BMKMapView左上角为原点向右向下增长
if ([dic[@"mapScaleBarPosition"] isValidParam]) {
self.mapScaleBarPosition = [[BMFMapPoint bmf_modelWith:dic[@"mapScaleBarPosition"]] toCGPoint];
}
// 当前地图范围,采用直角坐标系表示,向右向下增长
if ([dic[@"visibleMapBounds"] isValidParam]) {
BMFCoordinateBounds *visibleMapBounds = [BMFCoordinateBounds bmf_modelWith:dic[@"visibleMapBounds"]];
[self setVisibleMapRect:[visibleMapBounds toBMKMapRect] animated:YES];
}
// 地图预留边界
if ([dic[@"mapPadding"] isValidParam]) {
BMFEdgeInsets *edge = [BMFEdgeInsets bmf_modelWith:dic[@"mapPadding"]];
self.mapPadding = [edge toUIEdgeInsets];
}
// 设置mapPadding时地图中心(屏幕坐标BMKMapStatus.targetScreenPt)是否跟着改变默认YES
if ([dic[@"updateTargetScreenPtWhenMapPaddingChanged"] isValidParam]) {
self.updateTargetScreenPtWhenMapPaddingChanged = [dic[@"updateTargetScreenPtWhenMapPaddingChanged"] boolValue];
}
// 设定双指手势操作时BMKMapView的旋转和缩放效果的中心点。
// 设置为YES时以手势的中心点二个指头的中心点为中心进行旋转和缩放地图中心点会改变
// 设置为NO时以当前地图的中心点为中心进行旋转和缩放地图中心点不变
// 默认值为NO。
if ([dic[@"changeWithTouchPointCenterEnabled"] isValidParam]) {
self.ChangeWithTouchPointCenterEnabled = [dic[@"changeWithTouchPointCenterEnabled"] boolValue];
}
// 设定双击手势放大地图时BMKMapView的放大效果的中心点。
// 设置为YES时以双击的位置为中心点进行放大地图中心点会改变
// 设置为NO时以当前地图的中心点为中心进行放大地图中心点不变
// 默认值为YES。
if ([dic[@"changeCenterWithDoubleTouchPointEnabled"] isValidParam]) {
self.ChangeCenterWithDoubleTouchPointEnabled = [dic[@"changeCenterWithDoubleTouchPointEnabled"] boolValue];
}
// 设定地图是否显示室内图
if ([dic[@"baseIndoorMapEnabled"] isValidParam]) {
self.baseIndoorMapEnabled = [dic[@"baseIndoorMapEnabled"] boolValue];
}
// 设定室内图标注是否显示默认YES仅当显示室内图baseIndoorMapEnabled为YES时生效
if ([dic[@"showIndoorMapPoi"] isValidParam] && self.baseIndoorMapEnabled) {
self.showIndoorMapPoi = [dic[@"showIndoorMapPoi"] boolValue];
}
result = YES;
}
return result;
}
- (void)dealloc {
_mapViewOptions = nil;
// NSLog(@"-mapView-dealloc");
}
@end