Marcadores y Configuración de Mapas en iOS con Swift

Clase 42 de 52Curso de Desarrollo de Apps para iOS

Contenido del curso

Tu primera app en iOS

Proyecto: PlatziTweets

Resumen

Configurar un mapa completo en una aplicación iOS implica dominar varios aspectos: desde el ciclo de vida de las vistas hasta la creación dinámica de marcadores con MapKit. A continuación se explican los pasos clave para lograr que un mapa muestre todos los posts geolocalizados y se posicione automáticamente en la última publicación creada.

¿Por qué el mapa no ocupa toda la pantalla al asignar tamaños programáticamente?

Cuando asignas dimensiones de forma programática dentro del método viewDidLoad, es posible que la vista aún no tenga su tamaño definitivo. Esto ocurre porque el ciclo de vida de un view controller en iOS pasa por varias etapas, y en viewDidLoad los layouts finales todavía no se han calculado por completo.

La solución es mover la configuración del mapa al método viewDidAppear [0:47]. En este punto del ciclo de vida, la pantalla ya se mostró al usuario y todas las dimensiones están resueltas. Así, al ejecutar mapContainer.bounds, se obtiene el tamaño real y el mapa ocupa la pantalla completa sin márgenes indeseados.

¿Cómo pasar datos entre pantallas usando prepare for segue?

Para que la pantalla del mapa reciba el listado de posts, es necesario pasar parámetros entre view controllers. En proyectos con storyboards, el método indicado es prepare(for segue:) [2:55].

¿Qué validaciones se deben hacer dentro del segue?

  • Asignar un identificador al segue desde el storyboard, por ejemplo showMap [3:21].
  • Validar que el segue.identifier coincida con el esperado.
  • Castear segue.destination al tipo del controlador destino, en este caso MapViewController [3:50].

Dentro de ese bloque seguro, se asignan los posts filtrados. Aquí entra en juego la programación funcional con el método filter [4:42]: se filtran únicamente los posts que tengan ubicación mediante la propiedad hasLocation. El operador $0 representa cada elemento del arreglo durante la iteración, lo que permite escribir el filtro de manera concisa.

¿Cómo organizar el código con extensiones y marks?

Una buena práctica es separar la lógica de navegación en una extensión del view controller y usar un // MARK: - Navigation [2:30]. Esto mantiene el código organizado y facilita la búsqueda con el atajo Command + Shift + O, que abre el buscador rápido de archivos del proyecto.

¿Cómo crear marcadores dinámicos y posicionar la cámara del mapa?

Con los posts ya disponibles en el MapViewController, se crea una función setupMarkers que itera sobre ellos con forEach [5:30].

Para cada post se realiza lo siguiente:

  • Crear una instancia de MKPointAnnotation, que representa el marcador en el mapa [5:50].
  • Asignarle una coordenada con CLLocationCoordinate2D, extrayendo latitude y longitude del post [6:15].
  • Establecer el title del marcador con el texto del tuit y el subtitle con el nombre del autor [6:50].
  • Agregar la anotación al mapa con map.addAnnotation(marker) [7:10].

¿Cómo centrar el mapa en el último post creado?

Para que el mapa no aparezca en una ubicación genérica, se obtiene el último elemento del arreglo con posts.last [8:40]. Con esa coordenada se configura un MKMapCamera que acepta parámetros como:

  • lookingAtCenter: la coordenada donde arranca la cámara.
  • distance: el nivel de zoom, por ejemplo 30 puntos [9:25].
  • pitch: la inclinación, que puede dejarse en cero.
  • heading: la dirección en grados, como 12 grados de rotación [9:35].

Es importante que el heading se desenvuelva con guard let en lugar de forzar el valor opcional [9:50]. En Swift, forzar valores opcionales es una mala práctica porque puede provocar un crash. Usar guard let garantiza que el código sea seguro y que la aplicación continúe funcionando sin interrupciones.

Ajustar estos valores te permite controlar exactamente qué tan cerca o lejos aparece el mapa al abrirse. Experimenta con la distancia y el heading hasta encontrar la vista ideal para tu caso de uso.

Con estos pasos ya tienes una funcionalidad de mapa completa: obtención de ubicación, marcadores dinámicos y posicionamiento de cámara. MapKit ofrece muchas más posibilidades como trazar líneas entre calles, definir radios de cobertura o personalizar las anotaciones. ¿Qué otra funcionalidad de mapas te gustaría implementar en tu proyecto?