您可以使用信息窗口,在用户点按标记时向其显示信息。
信息窗口会自适应设备屏幕的方向,在其关联标记的正上方显示。默认信息窗口包含以粗体显示的标题,以及标题下方的文本片段。
信息窗口的内容由标记的 title
和 snippet
属性定义。如果 title
和 snippet
属性均为空白或 nil
,点击该标记将不会显示信息窗口。
一次只能显示一个信息窗口。如果用户点按另一个标记,将隐藏当前窗口,并打开新的信息窗口。如果用户点击一个目前正显示信息窗口的标记,该信息窗口将关闭并重新打开。
创建自定义信息窗口以添加其他文本或图片。借助自定义信息窗口,您可以完全控制弹出式窗口的外观。
添加信息窗口
下面这段代码将创建一个简单的标记,标记只有信息窗口的文本标题。
Swift
let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let london = GMSMarker(position: position) london.title = "London" london.map = mapView
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *london = [GMSMarker markerWithPosition:position]; london.title = @"London"; london.map = mapView;
使用 snippet
属性,您可以添加其他文本,该文本将以较小的字体显示在标题下面。超出信息窗口宽度的字符串将自动换行成多行。特别长的消息可能会被截断。
Swift
london.title = "London" london.snippet = "Population: 8,174,100" london.map = mapView
Objective-C
london.title = @"London"; london.snippet = @"Population: 8,174,100"; london.map = mapView;
显示/隐藏信息窗口
信息窗口可以响应用户对标记的触摸事件。您可以通过设置 GMSMapView
的 selectedMarker
属性,以编程方式显示或隐藏信息窗口:
- 将
selectedMarker
设置为要显示的标记的名称。 - 将
selectedMarker
设置为nil
可将其隐藏。
Swift
london.title = "London" london.snippet = "Population: 8,174,100" london.map = mapView // Show marker mapView.selectedMarker = london // Hide marker mapView.selectedMarker = nil
Objective-C
london.title = @"London"; london.snippet = @"Population: 8,174,100"; london.map = mapView; // Show marker mapView.selectedMarker = london; // Hide marker mapView.selectedMarker = nil;
将信息窗口设置为自动刷新
如果您希望信息窗口的新属性或内容在更改后立即显示,而不用等待信息窗口先隐藏更改然后再将其显示,请将标记的 tracksInfoWindowChanges
设为 YES
或 true
。默认值为 NO
或 false
。
Swift
london.tracksInfoWindowChanges = true
Objective-C
london.tracksInfoWindowChanges = YES;
要确定何时设置 tracksInfoWindowChanges
属性,您应权衡性能注意事项与让信息窗口自动重绘的优势。例如:
- 如果您要进行一系列更改,则可以先将属性设为
YES
,然后再改回NO
。 - 如果某个动画正在运行或者内容正在异步加载,您应将属性一直设为
YES
,直至操作完成。
使用标记的 iconView
属性时,另请参阅注意事项。
更改信息窗口的位置
信息窗口会自适应设备屏幕的方向,在其关联标记的正上方显示。您可以通过设置 infoWindowAnchor
属性来更改信息窗口相对于标记的位置。此属性可接受 CGPoint
,它定义为一个 (x,y) 偏移,其中 x 和 y 的范围都介于 0.0 和 1.0 之间。默认偏移为 (0.5, 0.0),即顶部居中。设置 infoWindowAnchor
偏移有助于使信息窗口与自定义图标对齐。
Swift
london.infoWindowAnchor = CGPoint(x: 0.5, y: 0.5) london.icon = UIImage(named: "house") london.map = mapView
Objective-C
london.infoWindowAnchor = CGPointMake(0.5, 0.5); london.icon = [UIImage imageNamed:@"house"]; london.map = mapView;
处理信息窗口上的事件
您可以监听以下信息窗口事件:
mapView:markerInfoWindow:
- 当某个标记即将被选中时调用。可以选择以UIView
的形式返回自定义信息窗口,以供标记使用。如需了解详情,请参阅下文中的自定义信息窗口。mapView:markerInfoContents:
- 在mapView:markerInfoWindow
返回 nil 时调用。mapView:didCloseInfoWindowOfMarker:
- 在标记的信息窗口关闭时调用。mapView:didLongPressInfoWindowOfMarker:
- 在长按标记的信息窗口后调用。
如需监听事件,您必须实现 GMSMapViewDelegate
协议。请参阅事件指南以及 GMSMapViewDelegate
中的方法列表。
GitHub 包含展示如何处理信息窗口事件的示例:
自定义信息窗口
通过创建用于定义自定义信息窗口布局的 UIView
子类,自定义信息窗口的内容。在该子类中,按需要定义视图。例如,您可以使用自定义 UILabel
实例来显示标题和摘要文本以及其他视图(例如 UIImageView
实例),以添加在信息窗口中显示的图片。
确保您的 ViewController
实现了 GMSIndoorDisplayDelegate
协议,并为 mapView:markerInfoWindow: 事件定义了监听器。当标记即将被选中时,系统会调用此事件监听器,以便您返回自定义 UIView
类的实例,以定义标记使用的自定义信息窗口。
下方图像分别显示一个默认信息窗口、一个包含自定义内容的信息窗口,以及一个包含自定义框架和背景的信息窗口。
Maps SDK for iOS 随附的 GitHub 上的代码示例包含自定义信息窗口示例。例如,请参阅 MarkerInfoWindowViewController.m (Objective-C)或 MarkerInfoWindowViewController.swift(Swift)的定义。
如需了解如何下载和运行这些示例,请参阅代码示例。