Есть ли простой способ удалить все аннотации на карте без повторения всех отображаемых аннотаций в Objective-c?
Как удалить все аннотации в MKMapView
Ответ 1
Да, вот как
[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;
}
Ответ 2
Вот самый простой способ сделать это:
-(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];
}
Ответ 3
Здесь, как удалить все аннотации, кроме местоположения пользователя, выписано явно, потому что я предполагаю, что снова приду к этому ответу:
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;
Ответ 4
Это очень похоже на ответ Sandip, за исключением того, что он не повторно добавляет местоположение пользователя, чтобы синяя точка не включалась и выключалась снова.
-(void)removeAllAnnotations
{
id userAnnotation = self.mapView.userLocation;
NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
[annotations removeObject:userAnnotation];
[self.mapView removeAnnotations:annotations];
}
Ответ 5
Вам не нужно сохранять ссылки на местоположение пользователя. Все, что вам нужно, это:
[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
Ответ 6
Быстрая версия:
func removeAllAnnotations() {
let annotations = mapView.annotations.filter {
$0 !== self.mapView.userLocation
}
mapView.removeAnnotations(annotations)
}
Ответ 7
Swift 3
if let annotations = self.mapView.annotations {
self.mapView.removeAnnotations(annotations)
}
Ответ 8
Swift 2.0 Простой и лучший:
mapView.removeAnnotations(mapView.annotations)
Ответ 9
Чтобы удалить один тип подкласса, вы можете сделать
mapView.removeAnnotations(mapView.annotations.filter({$0 is PlacesAnnotation}))
где PlacesAnnotation
является подклассом MKAnnotation