iOS地图开发移除大头针时,当前位置也被移除了的问题

最近在地图开发中,有些小伙伴遇到了一个问题就是在清除地图上所有的大头针的时候,发现当前位置也被清除了。这是我们不想要的,我们只想清除我们自己添加的大头针,当前位置并不需要清除掉。

一、先了解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了。

你可能感兴趣的:(iOS地图开发移除大头针时,当前位置也被移除了的问题)