Esta pagina se ve mejor con JavaScript habilitado

Agrupación de marcadores en Xamarin.iOS 11.0+

 ·  ☕ 2 minutos lectura  ·  ✍️ Saturnino Pimentel

Hace no mucho tiempo estaba investigando sobre el uso de mapas en Xamarin.iOS en específico de la agrupación de marcadores, para versiones anteriores a la 11 del SDK en iOS no encontré una implementación que ya fuera manejada por el MKMapView aunque había otros proyectos que ya te permitían implementar la funcionalidad, después de esa búsqueda me di una vuelta por Xamarin University (algo que debí hacer desde el inicio :D) y me encontré con el material actualizado y la grata sorpresa de que ya existe una forma de hacer una agrupación sin mucho esfuerzo haciendo uso del tipo MKMarkerAnnotationView.

Nota: Para este post es necesario que tengas conocimientos básicos sobre la funcionalidad de los mapas en iOS y el uso de la clase MKMapViewDelegate, si no estás familiarizado puedes ir al siguiente link .

A grandes rasgos debes crear una clase herede de MKPointAnnotation y que sobre escriba la propiedad Coordinate tal como se muestra la siguiente imagen.

1
2
3
4
public override CLLocationCoordinate2D Coordinate
        {
            get { return new CLLocationCoordinate2D(pin.Latitude, pin.Longitude); }
        }

También una clase que herede de MKMapViewDelegate y sobre escribir el método GetViewForAnnotation. Dentro de este método haremos una comparación para revisar si el parámetro de tipo IMKAnnotation es de nuestro tipo personalizado y obtendremos un identificador el cuál utilizaremos para reciclar nuestro marcador en caso de que exista o crear una instancia de MKAnnotationView o MKMarkerAnnotationView según corresponda, después de esto agregaremos el ClusteringIdentifier.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public override MKAnnotationView GetViewForAnnotation (MKMapView mapView, IMKAnnotation annotation)
{
	string Id = annotation is CustomAnnotation ? "pin" : "cluster";
	var pinView = mapView.DequeueReusableAnnotation(Id);
	if (pinView == null)
	{
		if (annotation is CustomAnnotation)
		{
		    pinView = new MKAnnotationView(annotation, "pin")
		    {
		        Image = UIImage.FromBundle("pin.png"),
		        CenterOffset = new CoreGraphics.CGPoint(0, -20)
		    };
		}
		else
		{
			pinView = new MKMarkerAnnotationView(annotation, "cluster");
		}
	}
	else
	{
		pinView.Annotation = annotation;
	}
	pinView.ClusteringIdentifier = "cluster";
	return pinView;
}

Con eso ya tendremos implementado nuestra agrupación de marcadores.

Espero que te resulte útil este post nos leemos después.
¡Saludos! @SaturPimentel

Fuentes

MKMarkerAnnotationView Xamarin University Xamarin University code

compartir en

Saturnino Pimentel
Escrito por
Saturnino Pimentel
Software developer