美文网首页iOS-Objective-CiOS-地图
iOS地图开发移除大头针时,当前位置也被移除了的问题

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

作者: 追沐 | 来源:发表于2017-08-28 10:47 被阅读25次

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

    一、先了解MAAnnotationView、MAAnnotation、MAUserLocation

    • MAAnnotationView是一个继承UIView的view,它是一个视图,视图上有图片等元素,这就是我们平时所说的大头针的本质,它其实就是一个view,放在了地图上而已。

    • MAAnnotationView类里有一个annotation属性,是标注点的protocol

    ///关联的annotation
    @property (nonatomic, strong) id <MAAnnotation> annotation;
    

    这里像不像我们平时写的协议呢?实际上就是一个协议

    ///该类为标注点的protocol,提供了标注类的基本信息函数
    @protocol MAAnnotation <NSObject>
    
    ///标注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<MAAnnotation>)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地图开发移除大头针时,当前位置也被移除了的问题

        本文链接:https://www.haomeiwen.com/subject/vepwdxtx.html