How do I remove all annotations from MKMapView except the user location annotation?

后端 未结 8 1272
天命终不由人
天命终不由人 2020-12-24 06:19

I use removeAnnotations to remove my annotations from mapView but same it remove user location ann. How can I prevent this, or how to get user ann

相关标签:
8条回答
  • 2020-12-24 07:02

    In Swift 4.1:

    Normally if you don't want to remove your MKUserLocation annotation you can simply run:

    self.mapView.removeAnnotations(self.annotations).

    This method by default does not remove the MKUserLocation annotation from the annotations list.

    However if you need to filter out all annotations except the MKUserLocation (see annotationsNoUserLocation variable below) for any other reason, like centering on all the annotations but the MKUserLocation annotation you can use this simple extension below.

    extension MKMapView {
    
        var annotationsNoUserLocation : [MKAnnotation] {
            get {
                return self.annotations.filter{ !($0 is MKUserLocation) }
            }
        }
    
        func showAllAnnotations() {
            self.showAnnotations(self.annotations, animated: true)
        }
    
        func removeAllAnnotations() {
            self.removeAnnotations(self.annotations)
        }
    
        func showAllAnnotationsNoUserLocation() {
            self.showAnnotations(self.annotationsNoUserLocation, animated: true)
        }
    
    }
    
    0 讨论(0)
  • 2020-12-24 07:04

    Update:

    When I tried with the iOS 9 SDK the user annotation is no longer removed. You can simply use

    mapView.removeAnnotations(mapView.annotations)
    

    Historical answer (for apps that run on iOS before iOS 9):

    Try this:

    NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
    [ annotationsToRemove removeObject:mapView.userLocation ] ;
    [ mapView removeAnnotations:annotationsToRemove ] ;
    

    EDIT: Swift version

    let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
    mapView.removeAnnotations( annotationsToRemove )
    
    0 讨论(0)
  • 2020-12-24 07:09

    Hi try this i got the solution from this code:

     NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
    [Mapview removeAnnotations:listRemoveAnnotations];
    
     [listRemoveAnnotations release];
    
    0 讨论(0)
  • 2020-12-24 07:14

    If your user location is kind of class of MKUserLocation, use isKindOfClass to avoid removing user location annotation.

    if (![annotation isKindOfClass:[MKUserLocation class]]) {
    
    }
    

    Else you can set a flag to recognize the kind of your annotations in – mapView:viewForAnnotation:.

    0 讨论(0)
  • 2020-12-24 07:18

    For Swift you can simply use a one-liner:

    mapView.removeAnnotations(mapView.annotations)
    

    Edit: As nielsbot mentioned it will also remove the user's location annotation unless you have set it up like this:

    mapView.showsUserLocation = true
    
    0 讨论(0)
  • 2020-12-24 07:18

    Swift 4.2 or later

    Add this line before adding the annotations

    mapView.removeAnnotations(mapView.annotations.filter { $0 !== mapView.userLocation })
    
    0 讨论(0)
提交回复
热议问题