思维导图:
实现
采纳协议<MAMapViewDelegate>
@interface WBMapViewController ()<MAMapViewDelegate>
...
#pragma mark - UISetup
- (void)setupMapView{
MAMapView *_mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:_mapView];
_mapView.showsScale = NO;
// 关闭camera旋转,节省性能
_mapView.rotateCameraEnabled = NO;
_mapView.showsUserLocation = YES;
/*
- 跟踪用户的位置
- 可以将用户定位在地图的中心,并且放大地图,有的时候,速度会有些慢!
*/
_mapView.userTrackingMode = MAUserTrackingModeFollow;
_mapView.allowsBackgroundLocationUpdates = YES;
_mapView.pausesLocationUpdatesAutomatically = NO;
// 设置代理
_mapView.delegate = self;
}
实现两个代理方法
- didUpdateUserLocation
#pragma mark - delegate
/**
* @brief 位置或者设备方向更新后,会调用此函数
* @param mapView 地图View
* @param userLocation 用户定位信息(包括位置与设备方向等数据) 是一个固定的对象
* @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
*/
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation {
// 0. 判断 `位置数据` 是否变化 - 不一定是经纬度变化!
if (!updatingLocation) {
return;
}
// 大概 1s 更新一次!
NSLog(@"%@ %p", userLocation.location, userLocation.location);
// 判断起始位置是否存在
if (_startLocation == nil) {
_startLocation = userLocation.location;
// 1. 实例化大头针
MAPointAnnotation *annotaion = [MAPointAnnotation new];
// 2. 指定坐标位置
annotaion.coordinate = userLocation.location.coordinate;
// 3. 添加到地图视图
[mapView addAnnotation:annotaion];
}
// 绘制轨迹模型
[mapView addOverlay:[_sportTracking appendLocation:userLocation.location]];
}
注意:
在GPS信号好的时候,是1s调用一次代理方法.
这里得到userLocation.location位置信息的地址是相同的,所以不能通过userLocation来判断用户的位置是否发生变化
- viewForAnnotation:
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation {
if (![annotation isKindOfClass:[MAPointAnnotation class]]) {
return nil;
}
static NSString *annotaionId = @"annotaionId";
MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotaionId];
if (annotationView == nil) {
annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotaionId];
}
UIImage *image = _sportTracking.SportImg;
annotationView.image = image;
annotationView.centerOffset = CGPointMake(0, -image.size.height * 0.5);
return annotationView;
}
提示:
MAUserlocation 是系统定位用户位置的默认大头针,显示在地图上是蓝色的圆点
MAPointAnnotaion 是自定义的大头针
结语
添加自定义的一个起始大头针的过程不难。实现两个代理方法即可,先创建一个大头针MAPointAnnotation
。在创建的过程中注意要给它设置一个坐标位置同时设置一个轨迹模型. 得到MAPointAnnotation
后通过addAnnotaion:
添加给地图View
viewForAnnotation:
返回自定义的大头针view.
在此过程中要注意设置图像的位置,需要让其偏移一些,否则就盖住了底层的定位圆点.
annotationView.centerOffset = CGPointMake(0, -image.size.height * 0.5);