¿Existe una forma sencilla de eliminar todas las anotaciones en un mapa sin iterar a través de todas las anotaciones mostradas en Objective-c?
¿Existe una forma sencilla de eliminar todas las anotaciones en un mapa sin iterar a través de todas las anotaciones mostradas en Objective-c?
Respuestas:
Si, asi es como
[mapView removeAnnotations:mapView.annotations]
Sin embargo, la línea de código anterior eliminará todas las anotaciones de mapa "PINS" del mapa, incluido el pin de ubicación del usuario "Pin azul". Para eliminar todas las anotaciones del mapa y mantener el marcador de ubicación del usuario en el mapa, hay dos formas posibles de hacerlo
Ejemplo 1, conservar la anotación de ubicación del usuario, eliminar todos los pines, volver a agregar el pin de ubicación del usuario, pero hay una falla con este enfoque, hará que el pin de ubicación del usuario parpadee en el mapa, debido a que se quita el pin y luego se agrega espalda
- (void)removeAllPinsButUserLocation1
{
id userLocation = [mapView userLocation];
[mapView removeAnnotations:[mapView annotations]];
if ( userLocation != nil ) {
[mapView addAnnotation:userLocation]; // will cause user location pin to blink
}
}
Ejemplo 2, personalmente prefiero evitar eliminar el pin de usuario de ubicación en primer lugar,
- (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;
}
Esta es la forma más sencilla de hacerlo:
-(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];
}
Aquí se explica cómo eliminar todas las anotaciones, excepto la ubicación del usuario, escritas explícitamente porque imagino que vendré a buscar esta respuesta nuevamente:
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;
Esto es muy similar a la respuesta de Sandip, excepto que no vuelve a agregar la ubicación del usuario, por lo que el punto azul no parpadea de nuevo.
-(void)removeAllAnnotations
{
id userAnnotation = self.mapView.userLocation;
NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
[annotations removeObject:userAnnotation];
[self.mapView removeAnnotations:annotations];
}
No es necesario guardar ninguna referencia a la ubicación del usuario. Todo lo que se necesita es:
[mapView removeAnnotations:mapView.annotations];
Y siempre que lo haya mapView.showsUserLocation
configurado YES
, seguirá teniendo la ubicación del usuario en el mapa. La configuración de esta propiedad YES
básicamente le pide a la vista del mapa que comience a actualizar y obtener la ubicación del usuario, para mostrarla en el mapa. De los MKMapView.h
comentarios:
// Set to YES to add the user location annotation to the map and start updating its location
Versión rápida:
func removeAllAnnotations() {
let annotations = mapView.annotations.filter {
$0 !== self.mapView.userLocation
}
mapView.removeAnnotations(annotations)
}