
Gli indicatori indicano singole posizioni sulla mappa.
Per impostazione predefinita, gli indicatori utilizzano un'icona standard con l'aspetto e il comportamento comuni di Google Maps. Se vuoi personalizzare l'indicatore, puoi modificarne il colore predefinito, sostituire l'immagine dell'indicatore con un'icona personalizzata o modificare altre proprietà dell'indicatore.
In risposta a un evento di clic su un indicatore, puoi aprire una finestra informativa. Una finestra informativa mostra testo o immagini in una finestra di dialogo sopra l'indicatore. Puoi utilizzare una finestra informativa predefinita per visualizzare il testo o creare una finestra informativa personalizzata per controllare completamente i contenuti.
Aggiungere un indicatore
Per aggiungere un indicatore, crea un
GMSMarker
oggetto che includa un position e un title e imposta il relativo map.
L'esempio seguente mostra come aggiungere un indicatore a un oggetto GMSMapView esistente. L'indicatore viene creato alle coordinate 10,10 e visualizza la stringa "Hello world" in una finestra informativa quando viene fatto clic.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.title = "Hello World" marker.map = mapView
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.title = @"Hello World"; marker.map = mapView;
Puoi animare l'aggiunta di nuovi indicatori alla mappa impostando la proprietà marker.appearAnimation su:
kGMSMarkerAnimationPopper far apparire l'indicatore dal relativogroundAnchorquando viene aggiunto.kGMSMarkerAnimationFadeInper far apparire l'indicatore gradualmente quando viene aggiunto.
Rimuovere un indicatore
Puoi rimuovere un indicatore dalla mappa impostando la proprietà map di GMSMarker su nil. In alternativa, puoi rimuovere tutte le sovrapposizioni (inclusi gli indicatori) attualmente sulla mappa chiamando il metodo clear di GMSMapView.
Swift
let camera = GMSCameraPosition.camera( withLatitude: -33.8683, longitude: 151.2086, zoom: 6 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) // ... mapView.clear()
Objective-C
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; // ... [mapView clear];
Se vuoi apportare modifiche a un indicatore dopo averlo aggiunto alla mappa, assicurati di conservare l'oggetto GMSMarker. Puoi modificare l'indicatore in un secondo momento apportando modifiche a questo oggetto.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.map = mapView // ... marker.map = nil
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.map = mapView; // ... marker.map = nil;
Modificare il colore dell'indicatore
Puoi personalizzare il colore dell'immagine dell'indicatore predefinito richiedendo una versione colorata dell'icona predefinita con markerImageWithColor: e passando l'immagine risultante alla proprietà icona di GMSMarker.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Personalizzare l'immagine dell'indicatore
Se vuoi modificare l'immagine dell'indicatore predefinito, puoi impostare un'icona personalizzata utilizzando
la proprietà icon o iconView dell'indicatore. Se iconView è impostato, l'API
ignora la proprietà icon.
Utilizzare la proprietà icon dell'indicatore
Il seguente snippet crea un indicatore con un'icona personalizzata fornita come UIImage nella proprietà icon. L'icona è centrata a Londra, in Inghilterra. Lo snippet presuppone che l'applicazione contenga un'immagine denominata "house.png".
Swift
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let london = GMSMarker(position: positionLondon) london.title = "London" london.icon = UIImage(named: "house") london.map = mapView
Objective-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *london = [GMSMarker markerWithPosition:positionLondon]; london.title = @"London"; london.icon = [UIImage imageNamed:@"house"]; london.map = mapView;
Se crei più indicatori con la stessa immagine, utilizza la stessa istanza di UIImage per ciascuno degli indicatori. In questo modo, il rendimento dell'applicazione migliora quando vengono visualizzati molti indicatori.
Questa immagine potrebbe avere più frame. Inoltre, viene rispettata la proprietà alignmentRectInsets, utile se un indicatore ha un'ombra o un'altra regione inutilizzabile.
Utilizzare la proprietà iconView dell'indicatore
Il seguente snippet crea un indicatore con un'icona personalizzata impostando la proprietà iconView dell'indicatore e anima una modifica del colore dell'indicatore.
Lo snippet presuppone che l'applicazione contenga un'immagine denominata "house.png".
Swift
import CoreLocation import GoogleMaps class MarkerViewController: UIViewController, GMSMapViewDelegate { var mapView: GMSMapView! var london: GMSMarker? var londonView: UIImageView? override func viewDidLoad() { super.viewDidLoad() let camera = GMSCameraPosition.camera( withLatitude: 51.5, longitude: -0.127, zoom: 14 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) view = mapView mapView.delegate = self let house = UIImage(named: "House")!.withRenderingMode(.alwaysTemplate) let markerView = UIImageView(image: house) markerView.tintColor = .red londonView = markerView let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let marker = GMSMarker(position: position) marker.title = "London" marker.iconView = markerView marker.tracksViewChanges = true marker.map = mapView london = marker } func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { UIView.animate(withDuration: 5.0, animations: { () -> Void in self.londonView?.tintColor = .blue }, completion: {(finished) in // Stop tracking view changes to allow CPU to idle. self.london?.tracksViewChanges = false }) } }
Objective-C
@import CoreLocation; @import GoogleMaps; @interface MarkerViewController : UIViewController <GMSMapViewDelegate> @property (strong, nonatomic) GMSMapView *mapView; @end @implementation MarkerViewController { GMSMarker *_london; UIImageView *_londonView; } - (void)viewDidLoad { [super viewDidLoad]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5 longitude:-0.127 zoom:14]; _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; self.view = _mapView; _mapView.delegate = self; UIImage *house = [UIImage imageNamed:@"House"]; house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; _londonView = [[UIImageView alloc] initWithImage:house]; _londonView.tintColor = [UIColor redColor]; CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127); _london = [GMSMarker markerWithPosition:position]; _london.title = @"London"; _london.iconView = _londonView; _london.tracksViewChanges = YES; _london.map = self.mapView; } - (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { [UIView animateWithDuration:5.0 animations:^{ self->_londonView.tintColor = [UIColor blueColor]; } completion:^(BOOL finished) { // Stop tracking view changes to allow CPU to idle. self->_london.tracksViewChanges = NO; }]; } @end
Poiché iconView accetta un UIView, puoi avere una gerarchia di controlli UI standard che definiscono gli indicatori, ogni visualizzazione con il set standard di funzionalità di animazione. Puoi includere modifiche alle dimensioni, al colore e ai livelli alfa dell'indicatore, nonché applicare trasformazioni arbitrarie. La proprietà iconView supporta l'animazione di tutte le proprietà animabili di UIView tranne frame e center.
Tieni presente le seguenti considerazioni quando utilizzi iconView:
- Il
UIViewpuò richiedere molte risorse quandotracksViewChangesè impostato suYES, il che potrebbe comportare un aumento dell'utilizzo della batteria. Al contrario, un singolo frameUIImageè statico e non deve essere sottoposto a rendering. - Alcuni dispositivi potrebbero avere difficoltà a eseguire il rendering della mappa se sullo schermo sono presenti molti indicatori, ognuno con il proprio
UIViewe tutti gli indicatori monitorano le modifiche contemporaneamente. - Un
iconViewnon risponde all'interazione dell'utente, in quanto è uno snapshot della visualizzazione. - La visualizzazione si comporta come se
clipsToBoundsfosse impostato suYES, indipendentemente dal valore effettivo. Puoi applicare trasformazioni che funzionano al di fuori dei limiti, ma l'oggetto che disegni deve essere all'interno dei limiti dell'oggetto. Tutte le trasformazioni/spostamenti vengono monitorati e applicati. In breve: le sottoviste devono essere contenute all'interno della visualizzazione. - Per utilizzare
-copyWithZone:suGMSMarker, devi prima copiareGMSMarkere poi impostare una nuova istanza diiconViewsulla copia.UIViewnon supportaNSCopying, quindi non può copiareiconView.
Per decidere quando impostare la proprietà tracksViewChanges, devi valutare le considerazioni sul rendimento rispetto ai vantaggi di avere l'indicatore ridisegnato automaticamente. Ad esempio:
- Se devi apportare una serie di modifiche, puoi impostare la proprietà su
YESe poi di nuovo suNO. - Quando è in corso un'animazione o i contenuti vengono caricati in modo asincrono, devi mantenere la proprietà impostata su
YESfinché le azioni non sono completate.
Modificare l'opacità dell'indicatore
Puoi controllare l'opacità di un indicatore con la relativa proprietà opacity. Devi specificare l'opacità come un valore float compreso tra 0.0 e 1.0, dove 0 è completamente trasparente e 1 è completamente opaco.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Puoi animare l'opacità dell'indicatore con
Core Animation
utilizzando GMSMarkerLayer.
Appiattire un indicatore
Le icone degli indicatori vengono in genere disegnate orientate verso lo schermo del dispositivo anziché verso la superficie della mappa, quindi la rotazione, l'inclinazione o lo zoom della mappa non modificano necessariamente l'orientamento dell'indicatore.
Puoi impostare l'orientamento di un indicatore in modo che sia piatto rispetto alla terra. Gli indicatori piatti ruotano quando la mappa viene ruotata e cambiano prospettiva quando la mappa viene inclinata. Come per gli indicatori normali, gli indicatori piatti mantengono le loro dimensioni quando la mappa viene ingrandita o rimpicciolita.
Per modificare l'orientamento dell'indicatore, imposta la proprietà flat dell'indicatore su YES o true.
Swift
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let londonMarker = GMSMarker(position: positionLondon) londonMarker.isFlat = true londonMarker.map = mapView
Objective-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon]; londonMarker.flat = YES; londonMarker.map = mapView;
Ruotare un indicatore
Puoi ruotare un indicatore attorno al relativo punto di ancoraggio impostando la proprietà rotation. Specifica la rotazione come tipo CLLocationDegrees, misurata in gradi in senso orario dalla posizione predefinita. Quando l'indicatore è piatto sulla mappa, la posizione predefinita è il nord.
L'esempio seguente ruota l'indicatore di 90°. L'impostazione della proprietà groundAnchor su 0.5,0.5 fa sì che l'indicatore venga ruotato attorno al suo centro anziché alla sua base.
Swift
let degrees = 90.0 londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5) londonMarker.rotation = degrees londonMarker.map = mapView
Objective-C
CLLocationDegrees degrees = 90; londonMarker.groundAnchor = CGPointMake(0.5, 0.5); londonMarker.rotation = degrees; londonMarker.map = mapView;
Gestire gli eventi sugli indicatori
Puoi ascoltare gli eventi che si verificano sulla mappa, ad esempio quando un utente tocca un indicatore. Per ascoltare gli eventi, devi implementare il
GMSMapViewDelegate protocollo. Consulta la sezione Eventi e
gesti degli indicatori per scoprire come gestire
eventi specifici degli indicatori. La guida agli eventi fornisce anche un elenco di
metodi su GMSMapViewDelegate. Per gli eventi di Street View, consulta
GMSPanoramaViewDelegate.