Как удалить все аннотации в MKMapView


Ответы:


247

Да вот как

[mapView removeAnnotations:mapView.annotations]

Однако предыдущая строка кода удалит все аннотации карты «PINS» с карты, включая булавку местоположения пользователя «Blue Pin». Чтобы удалить все аннотации карты и оставить на карте булавку местоположения пользователя, есть два возможных способа сделать это.

Пример 1, сохраните аннотацию местоположения пользователя, удалите все булавки, снова добавьте булавку местоположения пользователя, но у этого подхода есть недостаток, это приведет к тому, что булавка местоположения пользователя будет мигать на карте из-за удаления булавки и ее добавления назад

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];

    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

Пример 2, я лично предпочитаю избегать удаления булавки пользователя местоположения в первую очередь,

- (void)removeAllPinsButUserLocation2
{
    id userLocation = [mapView userLocation];
    NSMutableArray *pins = [[NSMutableArray alloc] initWithArray:[mapView annotations]];
    if ( userLocation != nil ) {
        [pins removeObject:userLocation]; // avoid removing user location off the map
    }

    [mapView removeAnnotations:pins];
    [pins release];
    pins = nil;
}

1
это тоже удаляет местоположение пользователя? что, если я хочу удалить все аннотации, кроме местоположения пользователя?
— Кевин Мендоза,

1
Вам не нужно сохранять ссылку на местоположение пользователя. Прочтите мой ответ ниже для получения дополнительной информации.
— Aviel Gross

36

Вот самый простой способ сделать это:

-(void)removeAllAnnotations
{
  //Get the current user location annotation.
  id userAnnotation=mapView.userLocation;

  //Remove all added annotations
  [mapView removeAnnotations:mapView.annotations]; 

  // Add the current user location annotation again.
  if(userAnnotation!=nil)
  [mapView addAnnotation:userAnnotation];
}

Хороший ответ, намного быстрее, чем повторять их все, особенно если у вас больше, чем несколько аннотаций.
— Мэтью Фредерик,

6
При удалении аннотации и последующем ее добавлении метка на карте начинает мигать. Это может не иметь большого значения для некоторых приложений, но может раздражать пользователя, если вы постоянно обновляете карту новыми аннотациями.
— RocketMan

По какой-то причине моя аннотация userLocation всегда исчезает при использовании этого метода. Решение Виктора Ван Хи мне подходит.
— Стивен Бернс

17

Вот как удалить все аннотации, кроме местоположения пользователя, явно написанные, потому что я думаю, что снова буду искать этот ответ:

NSMutableArray *locs = [[NSMutableArray alloc] init];
for (id <MKAnnotation> annot in [mapView annotations])
{
    if ( [annot isKindOfClass:[ MKUserLocation class]] ) {
    }
    else {
        [locs addObject:annot];
    }
}
[mapView removeAnnotations:locs];
[locs release];
locs = nil;

Спасибо, у меня это сработало: копирование и вставка, удаление [locs release] и изменение mapView на _mapView. Я следил за отличным руководством по MKDirections здесь devfright.com/mkdirections-tutorial и хотел удалить булавку после получения указаний. Я добавил код под последней строкой этого метода к методу «очистки маршрута»
— Hblegg

обновить удалить несколько - (IBAction) clearRoute: (UIBarButtonItem *) отправитель {self.destinationLabel.text = nil; self.distanceLabel.text = ноль; self.steps.text = ноль; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> аннотации в [аннотациях _mapView]) {if ([аннотация isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
— Hblegg

13

Это очень похоже на ответ Sandip, за исключением того, что он не добавляет повторно местоположение пользователя, поэтому синяя точка не мигает снова и снова.

-(void)removeAllAnnotations
{
    id userAnnotation = self.mapView.userLocation;

    NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
    [annotations removeObject:userAnnotation];

    [self.mapView removeAnnotations:annotations];
}

11

Вам не нужно сохранять ссылку на местоположение пользователя. Все, что нужно, это:

[mapView removeAnnotations:mapView.annotations]; 

И до тех пор, пока вы mapView.showsUserLocationустановили YES, у вас все еще будет местоположение пользователя на карте. При настройке этого свойства в YESосновном запрашивает отображение карты, чтобы начать обновление и выборку местоположения пользователя, чтобы отобразить его на карте. Из MKMapView.hкомментариев:

// Set to YES to add the user location annotation to the map and start updating its location

В итоге я использовал этот формат: [self.mapView.removeAnnotations (mapView.annotations)]
— Эдвард Хастед

6

Быстрая версия:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}



0

Чтобы удалить один тип подкласса, вы можете сделать

mapView.removeAnnotations(mapView.annotations.filter({$0 is PlacesAnnotation}))

где PlacesAnnotationподклассMKAnnotation

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.