Page Summary
-
This example demonstrates marker interaction on a map with two markers (Sydney and Melbourne).
-
When a marker is tapped, the map animates with a zoom, bearing, and viewing angle change, focusing on the selected marker.
-
The Melbourne marker has a custom info window displayed when tapped.
-
To run the sample code, set up your development environment with the Maps SDK for iOS and provide a valid API key.
Get started
Before you can try the sample code, you must configure your development environment. For more information, see Maps SDK for iOS code samples .
View the code
Swift
import GoogleMaps import UIKit final class MarkerEventsViewController : UIViewController { private lazy var mapView : GMSMapView = { let camera = GMSCameraPosition ( latitude : - 37.81969 , longitude : 144.966085 , zoom : 4 ) return GMSMapView ( frame : . zero , camera : camera ) }() private var melbourneMarker = GMSMarker ( position : CLLocationCoordinate2D ( latitude : - 37.81969 , longitude : 144.966085 )) override func loadView () { let sydneyMarker = GMSMarker ( position : CLLocationCoordinate2D ( latitude : - 33.8683 , longitude : 151.2086 )) sydneyMarker . map = mapView melbourneMarker . map = mapView mapView . delegate = self view = mapView } } extension MarkerEventsViewController : GMSMapViewDelegate { func mapView ( _ mapView : GMSMapView , markerInfoWindow marker : GMSMarker ) - > UIView ? { if marker == melbourneMarker { return UIImageView ( image : UIImage ( named : "Icon" )) } return nil } func mapView ( _ mapView : GMSMapView , didTap marker : GMSMarker ) - > Bool { // Animate to the marker CATransaction . begin () CATransaction . setAnimationDuration ( 3 ) let camera = GMSCameraPosition ( target : marker . position , zoom : 8 , bearing : 50 , viewingAngle : 60 ) mapView . animate ( to : camera ) CATransaction . commit () // Melbourne marker has a InfoWindow so return false to allow markerInfoWindow to // fire. Also check that the marker isn't already selected so that the InfoWindow // doesn't close. if marker == melbourneMarker && mapView . selectedMarker != melbourneMarker { return false } return true } }
Objective-C
#import "GoogleMapsDemos/Samples/MarkerEventsViewController.h" #import <QuartzCore/QuartzCore.h> #import <GoogleMaps/GoogleMaps.h> @implementation MarkerEventsViewController { GMSMapView * _mapView ; GMSMarker * _melbourneMarker ; BOOL _rotating ; } - ( void ) viewDidLoad { [ super viewDidLoad ]; GMSCameraPosition * camera = [ GMSCameraPosition cameraWithLatitude : -37.81969 longitude : 144.966085 zoom : 4 ]; _mapView = [ GMSMapView mapWithFrame : CGRectZero camera : camera ]; GMSMarker * sydneyMarker = [[ GMSMarker alloc ] init ]; sydneyMarker . position = CLLocationCoordinate2DMake ( -33.8683 , 151.2086 ); sydneyMarker . map = _mapView ; _melbourneMarker = [[ GMSMarker alloc ] init ]; _melbourneMarker . position = CLLocationCoordinate2DMake ( -37.81969 , 144.966085 ); _melbourneMarker . map = _mapView ; _mapView . delegate = self ; self . view = _mapView ; } #pragma mark - GMSMapViewDelegate - ( UIView * ) mapView: ( GMSMapView * ) mapView markerInfoWindow: ( GMSMarker * ) marker { if ( marker == _melbourneMarker ) { return [[ UIImageView alloc ] initWithImage : [ UIImage imageNamed : @"Icon" ]]; } return nil ; } - ( BOOL ) mapView: ( GMSMapView * ) mapView didTapMarker: ( GMSMarker * ) marker { GMSCameraPosition * camera = [[ GMSCameraPosition alloc ] initWithTarget : marker . position zoom : 8 bearing : 50 viewingAngle : 60 ]; // Animate to the marker [ CATransaction begin ]; [ CATransaction setAnimationDuration : 3.f ]; // 3 second animation [ CATransaction setCompletionBlock :^ { if ( _rotating ) { // Animation was interrupted by orientation change. [ CATransaction setDisableActions : true ]; // Disable animation to avoid interruption from rotation. [ _mapView animateToCameraPosition : camera ]; } }]; [ mapView animateToCameraPosition : camera ]; [ CATransaction commit ]; // Melbourne marker has a InfoWindow so return NO to allow markerInfoWindow to fire. Also check // that the marker isn't already selected so that the InfoWindow doesn't close. if ( marker == _melbourneMarker && mapView . selectedMarker != _melbourneMarker ) { return NO ; } // The Tap has been handled so return YES return YES ; } - ( void ) viewWillTransitionToSize: ( CGSize ) size withTransitionCoordinator :( id<UIViewControllerTransitionCoordinator> ) coordinator { _rotating = true ; [ coordinator animateAlongsideTransition : nil completion : ^ ( id<UIViewControllerTransitionCoordinatorContext> _Nonnull context ) { _rotating = false ; }]; [ super viewWillTransitionToSize : size withTransitionCoordinator : coordinator ]; } @ end . m

