处理标记事件
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
此示例显示了一个包含两个标记的地图。点按某个标记后,相机会缩放和旋转,以聚焦于所选标记。
开始使用
您必须先配置开发环境,然后才能试用该示例代码。如需了解详情,请参阅 Maps SDK for iOS 代码示例。
查看代码
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
在本地运行完整示例应用
Maps SDK for iOS 示例应用以GitHub 上的下载归档文件的形式提供。请按照以下步骤安装并试用 Maps SDK for iOS 示例应用。
- 运行
git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git
以将示例代码库克隆到本地目录。
打开一个终端窗口,导航到您克隆示例文件的目录,然后展开 GoogleMaps 目录:
Swift
cd maps-sdk-for-ios-samples-main/GoogleMaps-Swift
pod install
open GoogleMapsSwiftDemos.xcworkspace
Objective-C
cd maps-sdk-for-ios-samples-main/GoogleMaps
pod install
open GoogleMapsDemos.xcworkspace
- 在 Xcode 中,按下“编译”按钮,使用当前方案构建应用。构建会产生错误,提示您在 Swift 的
SDKConstants.swift
文件或 Objective-C 的 SDKDemoAPIKey.h
文件中输入 API 密钥。
- 从已启用 Maps SDK for iOS 的项目中获取 API 密钥。
- 针对 Swift 修改
SDKConstants.swift
文件,针对 Objective-C 修改 SDKDemoAPIKey.h
文件,然后将您的 API 密钥粘贴到 apiKey
或 kAPIKey
常量的定义中。例如:
Swift
static let apiKey = "YOUR_API_KEY"
Objective-C
static NSString *const kAPIKey = @"YOUR_API_KEY";
- 在
SDKConstants.swift
文件 (Swift) 或 SDKDemoAPIKey.h
文件 (Objective-C) 中,移除以下行,因为它用于注册用户定义的问题:
Swift
#error (Register for API Key and insert here. Then delete this line.)
Objective-C
#error Register for API Key and insert here.
- 构建并运行项目。系统随即会显示 iOS 模拟器窗口,其中列出了 Maps SDK 演示版。
- 选择显示的选项之一,以便试用 Maps SDK for iOS 的某项功能。
- 如果系统提示您允许 GoogleMapsDemos 访问您的位置信息,请选择允许。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-31。
[null,null,["最后更新时间 (UTC):2025-08-31。"],[[["\u003cp\u003eThis example demonstrates marker interaction on a map with two markers (Sydney and Melbourne).\u003c/p\u003e\n"],["\u003cp\u003eWhen a marker is tapped, the map animates with a zoom, bearing, and viewing angle change, focusing on the selected marker.\u003c/p\u003e\n"],["\u003cp\u003eThe Melbourne marker has a custom info window displayed when tapped.\u003c/p\u003e\n"],["\u003cp\u003eTo run the sample code, set up your development environment with the Maps SDK for iOS and provide a valid API key.\u003c/p\u003e\n"]]],["The code demonstrates a map with two markers. Tapping a marker triggers the camera to animate to that marker's location, zooming in, rotating to a bearing of 50, and setting the viewing angle to 60. For the Melbourne marker, tapping also displays an InfoWindow with an image. The code examples are in Swift and Objective-C, with instructions provided on how to setup and run a full sample app locally.\n"],null,["This example displays a map with two markers. When a marker is tapped, the camera zooms and rotates to focus on the selected marker.\n\nGet started\n\nBefore you can try the sample code, you must configure your development environment.\nFor more information, see [Maps SDK for iOS code samples](/maps/documentation/ios-sdk/examples).\n\nView the code \n\nSwift \n\n```swift\nimport GoogleMaps\nimport UIKit\n\nfinal class MarkerEventsViewController: UIViewController {\n\n private lazy var mapView: GMSMapView = {\n let camera = GMSCameraPosition(latitude: -37.81969, longitude: 144.966085, zoom: 4)\n return GMSMapView(frame: .zero, camera: camera)\n }()\n\n private var melbourneMarker = GMSMarker(\n position: CLLocationCoordinate2D(latitude: -37.81969, longitude: 144.966085))\n\n override func loadView() {\n let sydneyMarker = GMSMarker(\n position: CLLocationCoordinate2D(latitude: -33.8683, longitude: 151.2086))\n sydneyMarker.map = mapView\n melbourneMarker.map = mapView\n mapView.delegate = self\n view = mapView\n }\n}\n\nextension MarkerEventsViewController: GMSMapViewDelegate {\n func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -\u003e UIView? {\n if marker == melbourneMarker {\n return UIImageView(image: UIImage(named: \"Icon\"))\n }\n return nil\n }\n\n func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -\u003e Bool {\n // Animate to the marker\n CATransaction.begin()\n CATransaction.setAnimationDuration(3)\n let camera = GMSCameraPosition(target: marker.position, zoom: 8, bearing: 50, viewingAngle: 60)\n mapView.animate(to: camera)\n CATransaction.commit()\n\n // Melbourne marker has a InfoWindow so return false to allow markerInfoWindow to\n // fire. Also check that the marker isn't already selected so that the InfoWindow\n // doesn't close.\n if marker == melbourneMarker && mapView.selectedMarker != melbourneMarker {\n return false\n }\n return true\n }\n}https://github.com/googlemaps-samples/maps-sdk-for-ios-samples/blob/86408feffd008565cd2cafce8aff3dc27f1f41bb/GoogleMaps-Swift/GoogleMapsSwiftDemos/Swift/Samples/MarkerEventsViewController.swift#L14-L61\n \n```\n\nObjective-C \n\n```objective-c\n#import \"GoogleMapsDemos/Samples/MarkerEventsViewController.h\"\n\n#import \u003cQuartzCore/QuartzCore.h\u003e\n\n#import \u003cGoogleMaps/GoogleMaps.h\u003e\n\n@implementation MarkerEventsViewController {\n GMSMapView *_mapView;\n GMSMarker *_melbourneMarker;\n BOOL _rotating;\n}\n\n- (void)viewDidLoad {\n [super viewDidLoad];\n GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969\n longitude:144.966085\n zoom:4];\n _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];\n\n GMSMarker *sydneyMarker = [[GMSMarker alloc] init];\n sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086);\n sydneyMarker.map = _mapView;\n\n _melbourneMarker = [[GMSMarker alloc] init];\n _melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085);\n _melbourneMarker.map = _mapView;\n\n _mapView.delegate = self;\n self.view = _mapView;\n}\n\n#pragma mark - GMSMapViewDelegate\n\n- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {\n if (marker == _melbourneMarker) {\n return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@\"Icon\"]];\n }\n\n return nil;\n}\n\n- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {\n GMSCameraPosition *camera = [[GMSCameraPosition alloc] initWithTarget:marker.position\n zoom:8\n bearing:50\n viewingAngle:60];\n // Animate to the marker\n [CATransaction begin];\n [CATransaction setAnimationDuration:3.f]; // 3 second animation\n [CATransaction setCompletionBlock:^{\n if (_rotating) { // Animation was interrupted by orientation change.\n [CATransaction\n setDisableActions:true]; // Disable animation to avoid interruption from rotation.\n [_mapView animateToCameraPosition:camera];\n }\n }];\n\n [mapView animateToCameraPosition:camera];\n [CATransaction commit];\n\n // Melbourne marker has a InfoWindow so return NO to allow markerInfoWindow to fire. Also check\n // that the marker isn't already selected so that the InfoWindow doesn't close.\n if (marker == _melbourneMarker && mapView.selectedMarker != _melbourneMarker) {\n return NO;\n }\n\n // The Tap has been handled so return YES\n return YES;\n}\n\n- (void)viewWillTransitionToSize:(CGSize)size\n withTransitionCoordinator:(id\u003cUIViewControllerTransitionCoordinator\u003e)coordinator {\n _rotating = true;\n [coordinator\n animateAlongsideTransition:nil\n completion:^(\n id\u003cUIViewControllerTransitionCoordinatorContext\u003e _Nonnull context) {\n _rotating = false;\n }];\n [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];\n}\n\n@end \nhttps://github.com/googlemaps-samples/maps-sdk-for-ios-samples/blob/86408feffd008565cd2cafce8aff3dc27f1f41bb/GoogleMaps/GoogleMapsDemos/Samples/MarkerEventsViewController.m#L16-L98\n\n \n```\n\nRun the full sample app locally\n\nThe Maps SDK for iOS sample app is available as a\n[download archive](https://github.com/googlemaps-samples/maps-sdk-for-ios-samples/archive/main.zip)\nfrom [GitHub](https://github.com/googlemaps-samples/maps-sdk-for-ios-samples/tree/main/GoogleMaps).\nFollow these steps to install and try the Maps SDK for iOS sample app.\n\n1. Run `git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git` to clone the samples repository into a local directory.\n2. Open a terminal window, navigate to the directory where you cloned the sample files, and\n drill down into the GoogleMaps directory:\n\n Swift \n\n cd maps-sdk-for-ios-samples-main/GoogleMaps-Swift\n pod install\n open GoogleMapsSwiftDemos.xcworkspace\n\n Objective-C \n\n cd maps-sdk-for-ios-samples-main/GoogleMaps\n pod install\n open GoogleMapsDemos.xcworkspace\n\n3. In Xcode, press the compile button to [build the app](https://developer.apple.com/documentation/xcode/building-and-running-an-app) with the current scheme. The build produces an error, prompting you to enter your API key in the `SDKConstants.swift` file for Swift or`SDKDemoAPIKey.h` file for Objective-C.\n4. [Get an API key](/maps/documentation/ios-sdk/get-api-key) from your project with the [Maps SDK for iOS enabled](/maps/documentation/ios-sdk/cloud-setup#enabling-apis).\n5. Edit the `SDKConstants.swift` file for Swift or`SDKDemoAPIKey.h` file for Objective-C and paste your API key into the definition of either the `apiKey` or `kAPIKey` constant. For example: \n\n Swift \n\n ```scdoc\n static let apiKey = \"YOUR_API_KEY\"\n ```\n\n Objective-C \n\n ```objective-c\n static NSString *const kAPIKey = @\"YOUR_API_KEY\";\n ```\n6. In the `SDKConstants.swift` file (Swift) or`SDKDemoAPIKey.h` file (Objective-C), remove the following line, because it's used to register the user-defined issue: \n\n Swift \n\n ```text\n #error (Register for API Key and insert here. Then delete this line.)\n ```\n\n Objective-C \n\n ```text\n #error Register for API Key and insert here.\n ```\n7. Build and run the project. The iOS simulator window appears, showing a list of **Maps SDK Demos**.\n8. Choose one of the options displayed, to experiment with a feature of the Maps SDK for iOS.\n9. If prompted to allow GoogleMapsDemos to access your location, choose **Allow**."]]