最近在地图开发中,有些小伙伴遇到了一个问题就是在清除地图上所有的大头针的时候,发现当前位置也被清除了。这是我们不想要的,我们只想清除我们自己添加的大头针,当前位置并不需要清除掉。
一、先了解MAAnnotationView、MAAnnotation、MAUserLocation
MAAnnotationView是一个继承UIView的view,它是一个视图,视图上有图片等元素,这就是我们平时所说的大头针的本质,它其实就是一个view,放在了地图上而已。
MAAnnotationView类里有一个annotation属性,是标注点的protocol
///关联的annotation
@property (nonatomic, strong) id annotation;
这里像不像我们平时写的协议呢?实际上就是一个协议
///该类为标注点的protocol,提供了标注类的基本信息函数
@protocol MAAnnotation
///标注view中心坐标
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@optional
///annotation标题
@property (nonatomic, copy) NSString *title;
///annotation副标题
@property (nonatomic, copy) NSString *subtitle;
/**
* @brief 设置标注的坐标,在拖拽时会被调用.
* @param newCoordinate 新的坐标值
*/
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
@end
- 我们要生成大头针的时候需要实现地图的这个代理方法,在此代理方法中设置不同的大头针
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)annotation {
//用户当前位置大头针
if ([annotation isKindOfClass:[MAUserLocation class]])
{
static NSString *userLocationStyleReuseIndetifier = @"userLocationStyleReuseIndetifier";
MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:userLocationStyleReuseIndetifier];
if (annotationView == nil)
{
annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:userLocationStyleReuseIndetifier];
}
annotationView.canShowCallout = NO;
annotationView.image = [UIImage imageNamed:@"heardImg_passenger_default"];
annotationView.frame = CGRectMake(0, 0, 26, 26);
annotationView.contentMode = UIViewContentModeScaleToFill;
annotationView.layer.masksToBounds = YES;
return annotationView;
}
//其他大头针
else if ([annotation isKindOfClass:[MAPointAnnotation class]]) {
static NSString *stopCarReuseIndetifier = @"stopCarReuseIndetifier";
MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:stopCarReuseIndetifier];
if (annotationView == nil)
{
annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:stopCarReuseIndetifier];
}
UIImage *image = [UIImage imageNamed:@"centerAnnotation"];
annotationView.image = image;
annotationView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
annotationView.contentMode = UIViewContentModeScaleToFill;
annotationView.layer.masksToBounds = YES;
annotationView.centerOffset = CGPointMake(0, -0.5*image.size.height);
return annotationView;
}
return nil;
}
用户的当前位置,也叫定位小蓝点,定位精度圈等,实际上也是一个“大头针“,和我们添加在地图上的大头针一样,是一个MAAnnotationView,view上有一个关联的annotation。
当前位置的大头针是MAUserLocation类型,所以用[annotation isKindOfClass:[MAUserLocation class]]判断,其他的大头针是MAPointAnnotation类型。
二、怎么移除不会移除当前位置
NSMutableArray *removeAnnotations = [[NSMutableArray alloc]init];
//将所有需要移除打大头针添加一个数组,去掉当前位置的大头针
[removeAnnotations addObjectsFromArray:self.mapView.annotations];
[removeAnnotations removeObject:self.mapView.userLocation];
//移除需要移除的大头针
[self.mapView removeAnnotations:removeAnnotations];
思路也很简单,先创建一个可变数组接收需要移除的大头针对象,然后从该数组中将当前位置的大头针去掉,最后移除需要移除的数据就OK了。