准备工作
高德地图的集成
使用高德地图
1、引入相应的地图头文件
#import <AMapNaviKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <CoreLocation/CoreLocation.h>
2、声明权限
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>XXX将在XXX等服务中使用您的位置信息!</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>XXX将在XXX等服务中使用您的位置信息!</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>XXX将在XXX等服务中使用您的位置信息!</string>
- Location When In Use Usage Description:“前台定位”
- Location Always Use Usage Description:“后台定位”
- Location Always and When In Use Usage Description:“获取定位”
3、用户权限判断
//MARK: - 权限提示
- (void)openLocationAction{
if (![self openLocationServiceWithBlock]) {
UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"打开定位开关" message:@"定位开关未开启,请进入系统【设置】>【隐私】>【定位服务】中打开开关,并允许该APP使用定位服务" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertA = [UIAlertAction actionWithTitle:@"我知道了" style:UIAlertActionStyleCancel handler:nil];
[alertC addAction:alertA];
[self presentViewController:alertC animated:YES completion:nil];
}
}
//MARK: - 权限开启
- (BOOL)openLocationServiceWithBlock {
BOOL isOpen = NO;
if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied) {
isOpen = YES;
}
return isOpen;
}
4、实例化地图对象
//初始化地图
MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
//把地图添加至view
[self.view addSubview:mapView];
常见属性和方法
#pragma mark
#pragma make - 高德地图的属性
///是否显示指南针, 默认YES
- @property (nonatomic, assign) BOOL showsCompass;
MAMapTypeStandard = 0, ///< 普通地图
MAMapTypeSatellite, ///< 卫星地图
MAMapTypeStandardNight, ///< 夜间视图
MAMapTypeNavi, ///< 导航视图
MAMapTypeBus ///< 公交视图
- @property (nonatomic) MAMapType mapType;
///缩放级别(默认3-19,有室内地图时为3-20),个人感觉15可以的
- @property (nonatomic) CGFloat zoomLevel;
///是否显示用户位置
- @property (nonatomic) BOOL showsUserLocation;
///是否自定义用户位置精度圈(userLocationAccuracyCircle)对应的 view, 默认为 NO.
///如果为YES: 会调用 - (MAOverlayRenderer *)mapView (MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay 若返回nil, 则不加载.
/// 如果为NO : 会使用默认的样式.
- @property (nonatomic) BOOL customizeUserLocationAccuracyCircleRepresentation;
///指定定位是否会被系统自动暂停
@property (nonatomic) BOOL pausesLocationUpdatesAutomatically;
///是否允许后台定位。默认为NO。只在iOS 9.0之后起作用。
///设置为YES的时候必须保证 Background Modes 中的 Location updates处于选中状态,否则会抛出异常。
///注意:定位必须在停止的状态下设置(showsUserLocation = NO),否则无效
@property (nonatomic) BOOL allowsBackgroundLocationUpdates;
///设置当前地图的中心点,改变该值时,地图的比例尺级别不会发生变化
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
#pragma mark
#pragma make - 高德地图的方法
/**
* @brief 移除标注
* @param annotation 要移除的标注
*/
- (void)removeAnnotation:(id <MAAnnotation>)annotation;
/**
* @brief 移除一组标注
* @param annotations 要移除的标注数组
*/
- (void)removeAnnotations:(NSArray *)annotations;
/**
* @brief 向地图窗口添加标注,需要实现MAMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View
* @param annotation 要添加的标注
*/
- (void)addAnnotation:(id <MAAnnotation>)annotation;
/**
* @brief 向地图窗口添加一组标注,需要实现MAMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View
* @param annotations 要添加的标注数组
*/
- (void)addAnnotations:(NSArray *)annotations;
/**
* @brief 选中标注数据对应的view。注意:如果annotation对应的annotationView因不在屏幕范围内而被移入复用池,为了完成选中操作,会将对应的annotationView添加到地图上,并将地图中心点移至annotation.coordinate的位置。
* @param annotation 标注数据
* @param animated 是否有动画效果
*/
// 注:选中之可以手动添加气泡的显示
- (void)selectAnnotation:(id <MAAnnotation>)annotation animated:(BOOL)animated;
#pragma mark
#pragma make - 高德地图MAMapViewDelegate代理方法
/**
* @brief 位置或者设备方向更新后,会调用此函数
* @param mapView 地图View
* @param userLocation 用户定位信息(包括位置与设备方向等数据)
* @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
*/
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{
// if (updatingLocation) {
// self.Mylat = userLocation.coordinate.latitude;
// self.Mylng = userLocation.coordinate.longitude;
//
// if (!self.isFirstIn) {
// [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(self.Mylat, self.Mylng)];
// self.isFirstIn = YES;
// }
// }
}
/**
* @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription,并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined,会调用代理的此方法。
此方法实现调用后台权限API即可( 该回调必须实现 [locationManager requestAlwaysAuthorization] ); since 6.8.0
* @param locationManager 地图的CLLocationManager。
*/
- (void)mapViewRequireLocationAuth:(CLLocationManager *)locationManager{
[locationManager requestAlwaysAuthorization];
}
/**
* @brief 当选中一个annotation view时,调用此接口. 注意如果已经是选中状态,再次点击不会触发此回调。取消选中需调用-(void)deselectAnnotation:animated:
* @param mapView 地图View
* @param view 选中的annotation view
*/
- (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view{
// NSLog(@"%@",view);
// [((WMCustomAnnotationView *)view) setUpClloutView];
}
/**
* @brief 当取消选中一个annotation view时,调用此接口
* @param mapView 地图View
* @param view 取消选中的annotation view
*/
- (void)mapView:(MAMapView *)mapView didDeselectAnnotationView:(MAAnnotationView *)view{
// NSLog(@"%@",view);
// [((WMCustomAnnotationView *)view) removeAnnotationView];
}
自定义大头针和气泡
大头针(imageView)
是显示在地图上是一个图片,是高德地图MAAnnotationView的imageView,设置imageView就是设置地图上的大头针了。气泡(CalloutView)
一般是显示在大头针(MAPointAnnotation)顶部的一个视图,归根结底是一个view。它是添加在大头针视图(MAAnnotationView)上的一个视图。
1、新建类
1.1、新建Annotation类,继承于MAPointAnnotation
#import <AMapNaviKit/AMapNaviKit.h>
#import "WMDeviceLocationModel.h"
@interface WMCustomLocalAnnotation :MAPointAnnotation
/* 需要传给MAAnnotationView视图的数据 */
@property (nonatomic, strong) WMDeviceLocationDataModel *dataModel;
@end
1.2、新建AnnotationView类,继承于MAAnnotationView
#import <AMapNaviKit/MAMapKit.h>
#import "WMCustomLocalView.h"
#import "WMDeviceLocationModel.h"
@interface WMCustomAnnotationView : MAAnnotationView
/* AnnotationView对应的数据模型 */
@property (nonatomic, strong) WMDeviceLocationDataModel * _Nullable dataModel;
@end
//复写父类init方法
- (id)initWithAnnotation:(id<MAAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]){
//给大头针视图布局
[self setupUI]
}
return self;
}
- (void)setupUI{
}
2、创建Annotation对象,并传值
// 创建Annotation< WMCustomLocalAnnotation >
WMCustomLocalAnnotation *annotation = [[WMCustomLocalAnnotation alloc] init];
// 为Annotation的dataModel赋值,local为需要展示的数据
annotation.dataModel = local;
// 将annotation对象添加到地图中,调用addAnnotation方法时,会走
// - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation的代理方法
[self.mapView addAnnotation:annotation];
// 设置地图中心点
[self.mapView setCenterCoordinate: annotation.coordinate];
// 看业务要求,是否需要在添加Annotation前,删除其余Annotation
for (id anno in self.mapView.annotations) {
if ([anno isKindOfClass:[WMCustomLocalAnnotation class]]) {
[self.mapView removeAnnotation:anno];
}
}
3、创建WMCustomAnnotationView对象,并赋值
/**
* @brief 根据anntation生成对应的View
* @param mapView 地图View
* @param annotation 指定的标注
* @return 生成的标注View
*/
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation{
// 创建WMCustomAnnotationView
if ([annotation isKindOfClass:[WMCustomLocalAnnotation class]]) {
WMCustomAnnotationView *newAnnotationView = (WMCustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"userInfoAnnotation"];
if (!newAnnotationView) {
newAnnotationView = [[WMCustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"userInfoAnnotation"];
// canShowCallout:是否允许弹出callout
newAnnotationView.canShowCallout = NO;
///是否支持拖动
newAnnotationView.draggable = YES;
}
//给气泡赋值
WMCustomLocalAnnotation *customAnnotation = (WMCustomLocalAnnotation *)annotation;
newAnnotationView.dataModel = customAnnotation.dataModel;
return newAnnotationView;
}
return nil;
}
网友评论