Aggiungere una mappa all'app per iOS (Swift)

1. Prima di iniziare

Questo codelab ti spiega come iniziare a utilizzare Google Maps Platform per creare app per iOS in Swift. Dovrai creare un'app per iOS che:

  • Carica l'SDK Maps per iOS e l'SDK Maps per iOS.
  • Visualizza una mappa incentrata su Sydney, Australia.
  • Visualizza indicatori personalizzati per 100 punti intorno a Sydney.
  • Implementa il clustering degli indicatori.
  • Consente l'interazione dell'utente che centra nuovamente e traccia un cerchio sulla mappa quando viene toccato un indicatore.

Mappa con indicatori in un'app per iOS

Prerequisiti

  • Conoscenza di base dello sviluppo di Swift e iOS.

Obiettivi didattici

  • Caricamento di Maps SDK for iOS e di Google Maps SDK for iOS Utility Library.
  • Caricamento di una mappa.
  • Utilizzare indicatori, indicatori personalizzati e clustering di indicatori.
  • Utilizzare l'SDK Maps per il sistema di eventi iOS per offrire l'interazione dell'utente.
  • Controllo programmatico della fotocamera tramite mappa.
  • Disegnare sulla mappa.

Che cosa ti serve

Per completare questo codelab, hai bisogno dei seguenti account, servizi e strumenti:

  • Xcode 12.0 o versioni successive con un SDK target di 12.0 o versioni successive.
  • Cocoapodi installati.
  • Un account Google Cloud Platform con fatturazione abilitata (vedi il passaggio successivo).
  • Un progetto in Cloud Console con l'SDK Maps per iOS abilitato (vedi il passaggio successivo).

2. Configura

Per il passaggio di attivazione qui sotto, devi attivare l'SDK Maps per iOS.

Configurare Google Maps Platform

Se non hai ancora un account Google Cloud Platform e un progetto con la fatturazione abilitata, consulta la guida Utilizzo di Google Maps Platform per creare un account di fatturazione e un progetto.

  1. In Cloud Console, fai clic sul menu a discesa del progetto e seleziona il progetto che vuoi utilizzare per questo codelab.

  1. Abilita le API e gli SDK di Google Maps Platform richiesti per questo codelab in Google Cloud Marketplace. Per farlo, segui la procedura descritta in questo video o in questa documentazione.
  2. Genera una chiave API nella pagina Credentials di Cloud Console. Puoi seguire la procedura descritta in questo video o in questa documentazione. Tutte le richieste a Google Maps Platform richiedono una chiave API.

Guida rapida

Per iniziare il più rapidamente possibile, ecco un codice di avvio che ti aiuterà a seguire questo codelab.

  1. Clona il repository se hai installato git.
git clone https://github.com/googlemaps/codelab-maps-platform-101-swift.git

In alternativa, fai clic su Mi fornisci il codice per scaricare il codice sorgente.

  1. Dopo aver scaricato il codice, apri il progetto StarterApp nella directory /starter. Questo progetto include la struttura di base del file di cui hai bisogno per completare il codelab. Tutto ciò che ti serve è disponibile nella directory /starter/StarterApp.

Per visualizzare il codice della soluzione completo in esecuzione, visualizza il codice completato nella directory /solution/SolutionApp.

3. Installa l'SDK Maps per iOS

Il primo passaggio per utilizzare Maps SDK for iOS consiste nell'installare le dipendenze necessarie. La procedura prevede due passaggi: l'installazione dell'SDK di Maps per iOS e della Utility Maps per iOS dalla libreria delle dipendenze Cocoapods e per fornire la chiave API all'SDK.

  1. Aggiungi l'SDK Maps per iOS e l'SDK Maps per iOS in Podfile.

Questo codelab utilizza sia l'SDK Maps per iOS, che fornisce tutte le funzionalità di base di Google Maps, sia la Libreria applicazioni di iOS di Maps, che fornisce una varietà di utilità per arricchire la mappa, tra cui il clustering degli indicatori.

Per iniziare, in Xcode (o nel tuo editor di testo preferito) apri Podfile e aggiorna il file in modo da includere le dipendenze di Maps SDK for iOS e della Utility Library sotto il commento # Pods for StarterApp:

pod 'GoogleMaps', '6.1.0'
pod 'Google-Maps-iOS-Utils', '3.4.0'

Consulta la documentazione relativa alle versioni dell'SDK Maps per iOS per conoscere la versione più recente dell'SDK e indicazioni per la manutenzione.

Il tuo Podfile dovrebbe avere il seguente aspetto:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '12.0'

target 'StarterApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for StarterApp
  pod 'GoogleMaps', '6.1.0'
  pod 'Google-Maps-iOS-Utils', '3.4.0'
end
  1. Installa i pod Maps SDK for iOS e Maps SDK for iOS Utility Library.

Per installare le dipendenze, esegui pod install nella directory /starter dalla riga di comando. Cocoapods scarica automaticamente le dipendenze e crea StarterApp.xcworkspace.

  1. Dopo aver installato le dipendenze, esegui open StarterApp.xcworkspace dalla directory /starter per aprire il file in Xcode, quindi esegui l'app nel simulatore dell'iPhone premendo Command+R. Se tutto è configurato correttamente, il simulatore viene avviato e viene visualizzata una schermata nera. Non ti preoccupare, non hai ancora creato nulla, quindi è previsto!
  2. Importa l'SDK in AppDelegate.swift.

Ora che le dipendenze sono installate, è il momento di fornire la tua chiave API all'SDK. Il primo passaggio consiste nell'importare l'SDK Maps per iOS come dipendenza inserendo quanto segue sotto l'istruzione di importazione import UIKit:

import GoogleMaps
  1. Passa la tua chiave API all'SDK per iOS chiamando provideAPIKey su GMSServices in application: didFinishLaunchingWithOptions:
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.
    GMSServices.provideAPIKey("YOUR_API_KEY")

    return true
  }

Il file AppDelegate.swift aggiornato dovrebbe avere il seguente aspetto:

import UIKit
import GoogleMaps

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.
    GMSServices.provideAPIKey("YOUR_API_KEY")

    return true
  }

}

Sostituisci YOUR_API_KEY con la chiave API creata in Cloud Console.

Una volta installate le dipendenze e fornita la chiave API, puoi iniziare a effettuare chiamate all'SDK di Maps per iOS.

4. Visualizzazione di una mappa

È ora di visualizzare la tua prima mappa.

La parte più utilizzata dell'SDK di Maps per iOS è la classe GMSMapView, che fornisce molti dei metodi che consentono di creare e manipolare istanze di mappa. Ecco come è fatto.

  1. Apri ViewController.swift.

Qui svolgerai il resto del lavoro per questo codelab. Nota che gli eventi del ciclo di vita loadView e viewDidLoad del controller di visualizzazione sono già simulati.

  1. Importa l'SDK di Maps per iOS aggiungendolo nella parte superiore del file:
import GoogleMaps
  1. Dichiara una variabile di istanza ViewController per archiviare GMSMapView.

L'istanza di GMSMapView è l'oggetto principale con cui lavori in questo codelab, come riferimento per i diversi metodi di ciclo di vita del controller view e di intervenire su di esso. Per renderla disponibile, aggiorna l'implementazione di ViewController per dichiarare una variabile di istanza per archiviarla:

class ViewController: UIViewController {

  private var mapView: GMSMapView!

  ...
}
  1. In loadView, crea un'istanza di GMSCameraPosition.

GMSCameraPosition definisce il punto al centro della mappa e il livello di zoom visualizzato. Questo codice chiama il metodo cameraWithLatitude:longitude:zoom: per centrare la mappa su Sydney, in Australia, con una latitudine di -33,86 e una longitudine di 151,20, con un livello di zoom pari a 12:

let camera:GMSCameraPosition = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 12)
  1. In loadView, crea un'istanza di GMSMapView per creare un'istanza della mappa.

Per creare una nuova istanza della mappa, chiama GMSMapView(frame: CGRect, camera: GMSCameraPosition). Tieni presente che il frame è impostato su CGRect.zero, una variabile globale della libreria CGGeometry di iOS che specifica un frame di 0 larghezza, 0 altezza e che si trova in posizione (0,0) all'interno del controller di visualizzazione. La videocamera è impostata sulla posizione appena creata.

In seguito, per visualizzare la mappa, imposta la visualizzazione principale del controller della vista su mapView, in modo che la mappa venga visualizzata a schermo intero.

    mapView = GMSMapView(frame: .zero, camera: camera)
    self.view = mapView
  1. Imposta GMSMapViewDelegate sul controller di visualizzazione.

Una volta implementato, il delegato della visualizzazione mappa ti consente di gestire gli eventi delle interazioni utente sull'istanza GMSMapView di cui avrai bisogno in un secondo momento.

Innanzitutto, aggiorna l'interfaccia di ViewController in modo che sia conforme al protocollo per GMSMapViewDelegate:

class ViewController: UIViewController, GMSMapViewDelegate

Quindi, aggiungi questa funzione nella funzione loadView per impostare GMSMapViewDelegate su ViewController.

    mapView.delegate = self

Ora ricarica l'app nel simulatore di iOS (Command+R) e la mappa dovrebbe essere visualizzata come mostrato nella Figura 1.

App per iOS che mostra una mappa Google

Figura 1. App per iOS che mostra una mappa di Google Maps.

In questo passaggio hai creato un'istanza di GMSMapView per mostrare una mappa incentrata sulla città di Sydney, in Australia.

Il file ViewController.swift dovrebbe avere il seguente aspetto:

import UIKit
import GoogleMaps

class ViewController: UIViewController, GMSMapViewDelegate {

  private var mapView: GMSMapView!

  override func loadView() {

    // Load the map at set latitude/longitude and zoom level
    let camera:GMSCameraPosition = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 11)

    mapView = GMSMapView(frame: .zero, camera: camera)
    self.view = mapView
    mapView.delegate = self
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
  }

}

5. Definizione dello stile della mappa (facoltativo)

Puoi personalizzare lo stile della mappa utilizzando gli stili basati su cloud.

Crea un ID mappa

Se non hai ancora creato un ID mappa con uno stile associato, consulta la guida ID mappa per completare la seguente procedura:

  1. Crea un ID mappa.
  2. Associa un ID mappa a uno stile mappa.

Aggiungi l'ID mappa alla tua app

Per utilizzare l'ID mappa che hai creato nel passaggio precedente, apri il file ViewController.swift e, nel metodo loadView, crea un oggetto GMSMapID e forniscigli l'ID mappa. Poi modifica l'istanza di GMSMapView fornendo l'oggetto GMSMapID come parametro.

ViewController.swift

  override func loadView() {

    // Load the map at set latitude/longitude and zoom level
    let camera:GMSCameraPosition = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 11)
    let mapID = GMSMapID(identifier: "YOUR_MAP_ID")

    mapView = GMSMapView(frame: .zero, mapID: mapID, camera: camera)
    self.view = mapView
    mapView.delegate = self
  }

Al termine, esegui l'app per visualizzare la mappa nello stile che hai selezionato.

6. Aggiungere indicatori alla mappa

L'SDK di Maps per iOS richiede molte cose, ma è importante inserire gli indicatori sulla mappa. Gli indicatori mostrano punti specifici sulla mappa e rappresentano un elemento comune dell'interfaccia utente per la gestione dell'interazione degli utenti. Se hai già utilizzato Google Maps, probabilmente conosci l'indicatore predefinito, che ha un aspetto simile ai segnaposto rossi nella Figura 2:

Mappa con indicatori rossi

Figura 2. Mappa con indicatori rossi.

Questo passaggio illustra come utilizzare la classe GMSMarker per inserire indicatori sulla mappa.

Tieni presente che gli indicatori non possono essere inseriti sulla mappa fino a quando non viene caricata la mappa dal passaggio precedente nell'evento del ciclo di vita loadView del controller di visualizzazione, quindi completa questi passaggi nell'evento del ciclo di vita di viewDidLoad, che viene chiamato dopo che la visualizzazione (e la mappa) è stata caricata.

  1. Definisci un oggetto CLLocationCoordinate2D.

CLLocationCoordinate2D è una struttura resa disponibile dalla libreria CoreLocation di iOS, che definisce una posizione geografica a una latitudine e una longitudine impostate. Per iniziare a creare il tuo primo indicatore, definisci un oggetto CLLocationCoordinate2D e imposta la latitudine e la longitudine al centro della mappa. Le coordinate del centro della mappa sono accessibili dalla visualizzazione mappa utilizzando le proprietà camera.target.latitude e camera.target.longitude.

    // Add a single marker with a custom icon
    let mapCenter = CLLocationCoordinate2DMake(mapView.camera.target.latitude, mapView.camera.target.longitude)
  1. Crea un'istanza di GMSMarker.

L'SDK Maps per iOS fornisce la classe GMSMarker. Ogni istanza di GMSMarker rappresenta un singolo indicatore sulla mappa e viene creata chiamando markerWithPosition: e trasmettendolo un oggetto CLLocationCoordinate2D per indicare all'SDK dove posizionare l'indicatore sulla mappa.

    let marker = GMSMarker(position: mapCenter)
  1. Imposta un'icona dell'indicatore personalizzato.

L'indicatore rosso predefinito per Google Maps è fantastico, ma è anche possibile personalizzare la mappa. Fortunatamente, l'utilizzo di un indicatore personalizzato è molto semplice con l'SDK Maps per iOS. Tieni presente che il progetto StarterApp include un'immagine chiamata "custom_pin.png&#39" che puoi utilizzare, ma puoi usare qualsiasi immagine.

Per impostare l'indicatore personalizzato, imposta la proprietà icon dell'indicatore su un'istanza di UIImage.

    marker.icon = UIImage(named: "custom_pin.png")
  1. Visualizza l'indicatore sulla mappa.

L'indicatore è stato creato, ma non è ancora sulla mappa. A tale scopo, imposta la proprietà map dell'istanza GMSMarker su un'istanza di GMSMapView.

    marker.map = mapView

Ora ricarica l'app e osserva la tua prima mappa con un indicatore come mostrato nella Figura 3.

App per iOS che include una mappa Google con un indicatore rosso al centro

Figura 3. App per iOS con Google Maps e indicatore rosso al centro.

In breve, in questa sezione hai creato un'istanza della classe GMSMarker e l'hai applicata alla visualizzazione mappa per mostrare un indicatore sulla mappa. L'evento aggiornato del ciclo di vita viewDoneLoad in ViewController.swift dovrebbe ora avere il seguente aspetto:

  override func viewDidLoad() {
    super.viewDidLoad()

    // Add a single marker with a custom icon
    let mapCenter = CLLocationCoordinate2DMake(mapView.camera.target.latitude, mapView.camera.target.longitude)
    let marker = GMSMarker(position: mapCenter)

    marker.icon = UIImage(named: "custom_pin.png")
    marker.map = mapView
  }

7. Abilita cluster di indicatori

Se utilizzi molti indicatori o hai indicatori molto vicini tra loro, potresti riscontrare un problema in cui gli indicatori si sovrappongono o appaiono affollati, causando un'esperienza utente negativa. Ad esempio, se due indicatori sono molto vicini, potresti ottenere una situazione come mostrato nella Figura 4:

Due indicatori molto vicini

Figura 4. Due indicatori sono molto vicini.

È qui che entra in gioco il clustering degli indicatori. Il clustering degli indicatori è un'altra funzionalità ampiamente implementata, che raggruppa gli indicatori vicini in un'unica icona che varia a seconda del livello di zoom, come illustrato nella Figura 5:

Esempio di indicatori raggruppati in una singola icona

Figura 5. Esempio di indicatori raggruppati in una singola icona.

L'algoritmo per il clustering degli indicatori suddivide l'area visibile della mappa in una griglia, quindi raggruppa le icone che si trovano nella stessa cella. Il team di Google Maps Platform ha creato una utile libreria open source chiamata Google Maps SDK for iOS Utility Library che, tra le altre cose, gestisce automaticamente il clustering degli indicatori. Leggi ulteriori informazioni sul clustering degli indicatori nella documentazione di Google Maps Platform o controlla l'origine della libreria delle utilità per iOS su GitHub.

  1. Aggiungi molti altri indicatori alla mappa.

Per vedere il raggruppamento degli indicatori in azione, devi inserire sulla mappa molti indicatori. Per semplificare questa operazione, nel progetto iniziale in MarkerGenerator.swift troverai un pratico generatore di indicatori.

Per aggiungere un numero specifico di indicatori alla mappa, chiama MarkerGenerator(near:count:).markerArray nel ciclo di vita viewDidLoad del controller vista sotto il codice del passaggio precedente. Il metodo crea il numero di indicatori specificato in count in posizioni casuali intorno alle coordinate specificate in un oggetto CLLocationCoordinate2D. In questo caso, puoi trasmetterla alla variabile mapCenter che hai creato in precedenza. Gli indicatori vengono restituiti in un elemento [GMSMarker].

    // Generate many markers
    let markerArray = MarkerGenerator(near: mapCenter, count: 100).markerArray

Puoi testare l'aspetto di così tanti indicatori aggiungendo queste righe dopo la definizione di markerArray ed eseguendo l'app. Assicurati di aggiungere queste righe prima di passare ai passaggi successivi, che utilizzano invece lo strumento di cluster di indicatore per gestire la visualizzazione degli indicatori:

    // Comment the following code out if using the marker clusterer
    // to manage markers instead.
    for marker in markerArray {
      marker.map = mapView
    }
  1. Importa la Utilità Google Maps SDK for iOS.

Per aggiungere la libreria di utilità di iOS per Maps come dipendenza al tuo progetto, aggiungila all'elenco delle dipendenze nella parte superiore di ViewController.swift:

import GoogleMapsUtils
  1. Configura il clusterer di indicatore.

Per utilizzare il clusterer di indicatore, devi fornire tre elementi per configurare il suo funzionamento: un algoritmo di clustering, un generatore di icone e un renderer. L'algoritmo determina il comportamento di clustering degli indicatori, ad esempio la distanza tra gli indicatori da includere nello stesso cluster. Il generatore di icone fornisce icone dei cluster da utilizzare a diversi livelli di zoom. Il renderer gestisce la visualizzazione effettiva delle icone dei cluster sulla mappa.

Se preferisci, puoi scrivere tutto questo, ma la libreria di utilità di Maps per iOS fornisce implementazioni predefinite per semplificare il processo. Aggiungi:

    // Set up the cluster manager with a supplied icon generator and renderer.
    let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
    let iconGenerator = GMUDefaultClusterIconGenerator()
    let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
  1. Crea un'istanza di GMUClusterManager.

GMUClusterManager è la classe che implementa il clustering degli indicatori utilizzando l'algoritmo, il generatore di icone e il renderer specificati da te. Per creare il renderer e renderlo disponibile nella visualizzazione mappa, aggiungi innanzitutto una variabile di istanza all'implementazione ViewController per archiviare l'istanza di gestione del cluster:

class ViewController: UIViewController, GMSMapViewDelegate {

  private var mapView: GMSMapView!
  private var clusterManager: GMUClusterManager!
}

Quindi, crea l'istanza di GMUClusterManager nell'evento del ciclo di vita viewDidLoad:

    clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)
  1. Aggiungi gli indicatori ed esegui il cluster di indicatori.

Ora che l'istanza di cluster di indicatori è configurata, passa al gestore del cluster l'array di indicatori da raggruppare chiamando add(items:), quindi esegui il clusterer chiamando cluster.

    clusterManager.setMapDelegate(self)
    clusterManager.add(markerArray)
    clusterManager.cluster()

Ricarica la tua app e ora dovresti vedere molti indicatori ben raggruppati, come nell'esempio nella Figura 6. Vai avanti e divertiti con diversi livelli di zoom pizzicando e aumentando lo zoom sulla mappa per vedere i cluster di indicatori che si adattano man mano che aumenti o diminuisci lo zoom.

App per iOS con una mappa Google e indicatori di cluster

Figura 6. App per iOS con Google Maps e indicatori in cluster.

In questo modo, hai configurato un'istanza del clusterer di indicatori nell'SDK Google Maps SDK for iOS, quindi l'hai utilizzata per raggruppare 100 indicatori sulla mappa. L'evento del ciclo di vita di viewDidLoad in ViewController.swift dovrebbe essere simile al seguente:

  override func viewDidLoad() {
    super.viewDidLoad()

    // Add a single marker with a custom icon
    let mapCenter = CLLocationCoordinate2DMake(mapView.camera.target.latitude, mapView.camera.target.longitude)
    let marker = GMSMarker(position: mapCenter)

    marker.icon = UIImage(named: "custom_pin.png")
    marker.map = mapView

    // Generate many markers
    let markerArray = MarkerGenerator(near: mapCenter, count: 100).markerArray
    // Comment the following code out if using the marker clusterer
    // to manage markers instead.
    //    for marker in markerArray {
    //      marker.map = mapView
    //    }

    // Set up the cluster manager with a supplied icon generator and renderer.
    let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm()
    let iconGenerator = GMUDefaultClusterIconGenerator()
    let renderer = GMUDefaultClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator)
    clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)

    clusterManager.setMapDelegate(self)
    clusterManager.add(markerArray)
    clusterManager.cluster()
  }

8. Aggiungi interazione utente

Ora hai una mappa attraente che mostra indicatori e utilizza il clustering degli indicatori. In questo passaggio dovrai aggiungere ulteriori informazioni sulla gestione delle interazioni degli utenti utilizzando GMSMapViewDelegate, che hai impostato in precedenza sul controller di visualizzazione, per migliorare l'esperienza utente sulla mappa.

L'SDK Maps per iOS fornisce un sistema di eventi completo implementato tramite il delegato della visualizzazione mappa, che include i gestori di eventi che ti consentono di eseguire il codice quando si verificano varie interazioni degli utenti. Ad esempio, il delegato di MapView include metodi che ti consentono di attivare l'esecuzione del codice per le interazioni, come il clic sull'utente e la mappa, la panoramica della mappa, lo zoom in avanti e indietro, e altro ancora.

In questo passaggio, puoi eseguire la panoramica in modo programmatico della mappa su qualsiasi indicatore toccato dall'utente.

  1. Implementa il listener di tocco dell'indicatore.

mapView(_:didTap:) viene chiamato ogni volta che l'utente tocca uno degli indicatori creati in precedenza e ogni volta che tocca un cluster di indicatore (i cluster di indicatori interni sono implementati come istanza di GMSMarker).

Per implementare il listener di eventi, inizia strofinandolo in fondo a ViewController.swift prima della parentesi graffa di chiusura.

  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {

    return false
  }

Tieni presente che il metodo restituisce false. In questo modo indichi all'SDK di iOS di continuare a eseguire la funzionalità predefinita di GMSMarker, ad esempio di mostrare una finestra informativa se ne è stata configurata una dopo l'esecuzione del codice del gestore di eventi.

  1. Gestisci l'evento di tocco e anima la fotocamera per ricentrare la mappa quando viene toccato un indicatore.

Quando la chiamata viene eseguita, mapView(_:didTap:) passa l'istanza di GMSMarker che è stata toccata per consentirti di gestirla nel codice. Puoi utilizzare questa istanza per ricentrare la mappa richiamando animate(toLocation:) sulla visualizzazione mappa dall'interno del gestore di eventi e passando la posizione dell'istanza dell'indicatore dalla proprietà position.

    // Animate to the marker
    mapView.animate(toLocation: marker.position)
  1. Aumenta lo zoom su un cluster indicatore quando viene toccato.

Un pattern UX comune consiste nell'aumentare lo zoom sui cluster degli indicatori quando vengono toccati. Questo consente agli utenti di visualizzare gli indicatori in cluster, mentre il cluster si espande a livelli di zoom inferiori.

Come indicato in precedenza, l'icona del cluster dell'indicatore in realtà è un'implementazione di GMSMarker con un'icona personalizzata. Come puoi capire se un indicatore o un cluster di indicatori è stato toccato? Quando il gestore del cluster di indicatori crea una nuova icona di cluster, implementa l'istanza di GMSMarker in modo che sia conforme a un protocollo chiamato GMUCluster.. Puoi utilizzare una condizione per verificare se l'indicatore passato nel gestore di eventi è conforme a questo protocollo.

Una volta che sai a livello di programmazione che un cluster è stato toccato, puoi chiamare animate(toZoom:) sull'istanza di visualizzazione mappa e impostare lo zoom sul livello di zoom corrente più uno. Il livello di zoom corrente è disponibile nell'istanza mapView nella proprietà camera.zoom.

Inoltre, nota come il codice riportato di seguito restituisce true. Questa opzione informa il gestore di eventi che hai completato la gestione dell'evento e non deve eseguire ulteriori codici nel gestore. Uno dei motivi per cui ciò si verifica è impedire all'oggetto GMSMarker sottostante di eseguire il resto del comportamento predefinito, ad esempio la visualizzazione di una finestra informativa, che non avrebbe molto senso nel caso in cui si toccasse un'icona di cluster.

    // If the tap was on a marker cluster, zoom in on the cluster
    if let _ = marker.userData as? GMUCluster {
      mapView.animate(toZoom: mapView.camera.zoom + 1)
      return true
    }

Ora ricarica l'app e tocca alcuni indicatori e cluster di indicatori. Quando viene toccato uno dei due valori, la mappa viene ricentrata sull'elemento toccato. Quando viene toccato un cluster di indicatori, la mappa aumenta anche lo zoom di un livello e il cluster si espande per mostrare gli indicatori raggruppati sotto.

Ricapitolando, in questo passaggio hai implementato il listener di tocchi. Hai gestito l'evento per centrare di nuovo l'elemento toccato e aumentare lo zoom se l'elemento è un'icona di cluster di indicatore.

Il metodo mapView(_:didTap:) dovrebbe avere il seguente aspetto:

  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {

    // Animate to the marker
    mapView.animate(toLocation: marker.position)

    // If the tap was on a marker cluster, zoom in on the cluster
    if let _ = marker.userData as? GMUCluster {
      mapView.animate(toZoom: mapView.camera.zoom + 1)
      return true
    }

    return false
  }

9. Disegna sulla mappa

Finora hai creato una mappa di Sydney che mostra indicatori in 100 punti casuali e che gestisce l'interazione degli utenti. Nell'ultimo passaggio di questo codelab, utilizzerai le funzionalità di disegno di Maps SDK for iOS per aggiungere un'ulteriore funzionalità utile alla tua esperienza sulla mappa.

Immagina che questa mappa venga utilizzata dagli utenti che hanno intenzione di esplorare la città di Sydney. Una funzionalità utile consiste nel visualizzare un raggio intorno a un indicatore quando viene selezionato. consentendo all'utente di comprendere facilmente quali altre destinazioni si trovano a pochi passi dall'indicatore selezionato.

L'SDK per iOS include un insieme di funzioni per disegnare forme sulla mappa, come quadrati, poligoni, linee e cerchi. In questo passaggio, visualizza un cerchio per mostrare un raggio di 800 metri intorno all'indicatore quando viene selezionato.

  1. Aggiungi una variabile di istanza circle all'implementazione di ViewController.

Questa variabile di istanza viene utilizzata per salvare il cerchio tracciato più di recente, in modo che possa essere eliminato prima di tracciare un'altra. Dopotutto, non sarebbe molto utile per l'utente e non sarebbe bello se ogni indicatore toccato avesse un cerchio intorno a te!

A tale scopo, aggiorna l'implementazione di ViewController in questo modo:

class ViewController: UIViewController, GMSMapViewDelegate {

  private var mapView: GMSMapView!
  private var clusterManager: GMUClusterManager!
  private var circle: GMSCircle? = nil
  ...
}
  1. Disegna il cerchio quando viene toccato un indicatore.

Nella parte inferiore del metodo mapView(_:didTap:) appena sopra l'istruzione return false, aggiungi il codice mostrato qui per creare un'istanza della classe GMSCircle dell'SDK di iOS per disegnare un nuovo cerchio di 800 metri chiamando GMSCircle(position:radius:) e passando la posizione dell'indicatore toccato come hai fatto quando hai centrato nuovamente la mappa.

    // Draw a new circle around the tapped marker
    circle = GMSCircle(position: marker.position, radius: 800)
  1. Applica stili al cerchio.

Per impostazione predefinita, GMSCircle traccia un cerchio con un tratto nero e un riempimento trasparente. Funziona per mostrare il raggio, ma non è bellissimo e un po' difficile da vedere. Quindi, assegna un colore di riempimento al cerchio per migliorarne lo stile assegnando un UIColor alla proprietà fillColor del cerchio. Il codice mostrato qui aggiunge un riempimento grigio con una trasparenza del 50%:

    circle?.fillColor = UIColor(red: 0.67, green: 0.67, blue: 0.67, alpha: 0.5)
  1. Traccia il cerchio sulla mappa.

Come hai creato gli indicatori precedenti, la creazione di un'istanza di GMSCircle non mostra la mappa. A tale scopo, assegna l'istanza di visualizzazione mappa alla proprietà map della cerchia.

    circle?.map = mapView
  1. Rimuovi le cerchie visualizzate in precedenza.

Come detto in precedenza, non sarebbe un'ottima esperienza per gli utenti continuare ad aggiungere cerchi alla mappa. Per rimuovere la cerchia visualizzata da un evento di tocco precedente, imposta la proprietà map di circle su nil in cima a mapView(_:didTap:).

    // Clear previous circles
    circle?.map = nil

Ricarica l'app e tocca un indicatore. Dovresti vedere un nuovo cerchio tracciato ogni volta che viene toccato un indicatore e viene rimosso qualsiasi cerchio visualizzato in precedenza, come mostrato nella Figura 7.

Un cerchio disegnato intorno all'indicatore toccato

Figura 7. Un cerchio disegnato intorno all'indicatore toccato.

Riepilogando, in questo passaggio hai utilizzato la classe GMSCircle per visualizzare un cerchio ogni volta che viene toccato un indicatore.

Il metodo mapView(_:didTap:) dovrebbe avere il seguente aspetto:

  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {

    // Clear previous circles
    circle?.map = nil

    // Animate to the marker
    mapView.animate(toLocation: marker.position)

    // If the tap was on a marker cluster, zoom in on the cluster
    if let _ = marker.userData as? GMUCluster {
      mapView.animate(toZoom: mapView.camera.zoom + 1)
      return true
    }

    // Draw a new circle around the tapped marker
    circle = GMSCircle(position: marker.position, radius: 800)
    circle?.fillColor = UIColor(red: 0.67, green: 0.67, blue: 0.67, alpha: 0.5)
    circle?.map = mapView
    return false
  }

10. Complimenti

Hai creato un'app per iOS in cui è attiva una mappa Google interattiva.

Che cosa hai imparato

Passaggi successivi

  • Esplora o crea un fork del repository GitHub di campioni e demo di maps-sdk-for-ios-samples per trovare più ispirazione
  • Scopri altri codelab per Swift per creare app per iOS con Google Maps Platform
  • Aiutaci a creare i contenuti che troverai più utili rispondendo alla domanda di seguito:

Quali altri codelab vorresti vedere?

Visualizzazione dei dati sulle mappe Ulteriori informazioni sullo stile delle mappe Creazione di interazioni 3D nelle mappe

Il codelab non vuoi vedere sopra? Richiedilo qui con un nuovo problema.