首先,我的位置图标,设计成角的方向指向正上方,因为高德地图的指南针朝向默认是零度(正北 0 being true North),当然其它角度也可以,这样设计只是为了方便计算调整。
/**
* @brief 根据anntation生成对应的View
* @param mapView 地图View
* @param annotation 指定的标注
* @return 生成的标注View
*/
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation {
if ([annotation isKindOfClass:[MAPointAnnotation class]]) {
static NSString *reuseIndetifier = @"MAAnnotationView";
MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
if (annotationView == nil)
{
annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:reuseIndetifier];
}
annotationView.image = [UIImage imageNamed:@"ic_point"];
annotationView.canShowCallout= NO; //设置气泡可以弹出,默认为NO
//设置中心点偏移,使得标注底部中间点成为经纬度对应点
annotationView.centerOffset = CGPointMake(0, -18);
return annotationView;
} else if ([annotation isKindOfClass:[MAUserLocation class]]) {
// 定义我的位置图片
static NSString *locationIndetifier = @"MAUserLocationView";
if (self.userLocationAnnotationView == nil) {
self.userLocationAnnotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:locationIndetifier];
self.userLocationAnnotationView.image = [UIImage imageNamed:@"ic_location_arrow"];
}
return self.userLocationAnnotationView;
}
return nil;
}
}
位置或者设备方向更新后,调整我的位置图标的角度
/**
* @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.userLocationAnnotationView != nil) {
[UIView animateWithDuration:0.1 animations:^{
double degree = userLocation.heading.trueHeading - self.mapView.rotationDegree;
self.userLocationAnnotationView.transform = CGAffineTransformMakeRotation(degree * M_PI / 180.f);
}];
}
}