本概览介绍了如何使用 Maps SDK for iOS 配置已添加到 iOS 应用的地图。
概览
将地图添加到应用后,您便可以配置地图的初始选项和运行时设置。如需详细了解如何添加地图容器,请参阅添加地图。
初始地图设置包括:
在运行时,您可以通过更新 GMSMapView
对象来配置这些设置和一些额外的设置。
地图选项
初始化地图视图时,您可以使用 GMSMapViewOptions
设置配置选项。选项属性包括 frame
、camera
、mapID
或 backgroundColor
。
地图选项 | |
---|---|
帧 | 值:
CGRect 地图框架。默认为 CGRectZero。
|
camera | 值:
GMSCameraPosition 默认地图摄像头位置。
|
mapID | 值:
GMSMapID Google 地图 ID。可选参数。
|
backgroundColor | 值:
UIColor 默认为 UIColor.lightGray
|
配置地图选项
您可以设置自己的选项属性,也可以将包含默认值的实例化 GMSMapViewOptions
直接传递给 GMSMapView
。
Swift
let options = GMSMapViewOptions() options.camera = GMSCameraPosition.camera(withLatitude: -33.8683, longitude: 151.2086, zoom: 6) let mapView = GMSMapView(options:options)
Objective-C
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];
下面的示例展示了如何将包含默认值的 GMSMapViewOptions
对象直接传递给 GMSMapView
。
Swift
let options = GMSMapViewOptions() let mapView = GMSMapView(options:options) //initialized with default values
Objective-C
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; //initialized with default values
配置背景颜色
在深色模式下工作或在地图视图之间切换时,覆盖默认地图背景颜色可能会很有用。您可以通过设置地图选项 backgroundColor
属性来实现此目的。
Swift
let options = GMSMapViewOptions() options.backgroundColor = UIColor.yellowColor let mapView = GMSMapView(options:options)
Objective-C
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.backgroundColor = UIColor.yellowColor; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];
地图类型
您可以使用以下任意一种地图类型来自定义地图。地图的类型决定了地图的整体表现形式。例如,地图集通常包含侧重于显示边界的政治地图,而道路地图则会显示某个城市或地区的所有道路。Maps SDK for iOS 提供以下类型的地图:
地图类型 | |
---|---|
正常 | 值:
kGMSTypeNormal 典型的路线图。显示道路、人类建造的一些地图项以及河流等重要的自然地图项。此外,还会显示道路和地图项标签。支持将地图配色方案设置为深色、浅色或采用系统设置。
|
混合 | 值:
kGMSTypeHybrid 同时添加了卫星照片数据和路线图。此外,还会显示道路和地图项标签。 |
卫星 | 值:
kGMSTypeSatellite 卫星照片数据。不显示道路和地图项标签。
|
地形 | 值:
kGMSTypeTerrain 地形数据。地图包含颜色、轮廓线和标签以及透视阴影。此外,还会显示一些道路和标签。支持将地图配色方案设置为深色、浅色或采用系统设置。
|
无 | 值:
kGMSTypeNone 没有地图图块。该地图不会渲染基本地图图块。此模式与功能块层结合使用非常有用。当地图类型设置为“无”时,系统会停用显示交通数据的功能。 |
更改地图类型
如需设置地图的类型,请为 GMSMapView.mapType
属性分配一个新值。例如,如需显示卫星地图类型:
Swift
let options = GMSMapViewOptions() options.camera = GMSCameraPosition.camera(withLatitude: -33.8683, longitude: 151.2086, zoom: 6) let mapView = GMSMapView(options:options) mapView.mapType = .satellite
Objective-C
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; mapView.mapType = kGMSTypeSatellite;
下面的选择器显示了同一位置的 terrain 地图、normal 地图和 hybrid 地图的比较情况:
室内地图
在较高的缩放级别下,Maps SDK for iOS 会显示机场、购物中心、大型零售商店和公交站点等室内场所的楼层平面图。室内平面图都集成到了“Normal”地图类型 (kGMSTypeNormal
) 的默认地图图块中,它们会在用户放大地图时自动启用,并在用户缩小地图时逐渐消失。
您可以通过将 GMSMapView
的 indoorEnabled
属性设置为 NO
来停用室内地图。
Swift
mapView.isIndoorEnabled = false
Objective-C
mapView.indoorEnabled = NO;
或者,您也可以只停用楼层选择器控件。
添加楼层平面图
部分位置提供平面图。如果您想在应用中突出显示的建筑物没有楼层平面图数据,则您可以执行以下操作:
路况图层
您可以授权用户查看在顶部叠加了交通密度信息的地图。这样可让用户直观了解本地的交通状况。您可以通过调用 trafficEnabled
方法启用和停用路况图层。以下示例展示了路况图层在地图上的可能显示方式。
无障碍
默认情况下,地图上的辅助功能元素是隐藏的。您可以通过将 GMSMapView
的 accessibilityElementsHidden
属性设置为 NO
来启用无障碍功能。这会导致为叠加对象(例如 GMSMarker
和信息窗口 GMSPolyline
等)生成无障碍功能元素。
Swift
mapView.accessibilityElementsHidden = false
Objective-C
mapView.accessibilityElementsHidden = NO;
此属性遵循非正式的 UIAccessibility
协议,但 Maps SDK for iOS 中的默认值为 YES
。
我的位置
默认情况下,地图上不显示任何位置数据。您可以通过在 GMSMapView
上设置 myLocationEnabled
来启用蓝色的“我的位置”圆点和指南针方向。
Swift
mapView.isMyLocationEnabled = true
Objective-C
mapView.myLocationEnabled = YES;
启用此功能后,系统会通过 myLocation
属性提供用户的当前位置。此属性可能不会立即可用 - 例如,如果 iOS 提示用户允许他人访问此数据,在本例中,它是 nil
。
Swift
print("User's location: \(String(describing: mapView.myLocation))")
Objective-C
NSLog(@"User's location: %@", mapView.myLocation);
3D 建筑
近距离观看时,很多城市会显示 3D 建筑,如以下华盛顿州西雅图的图片所示。
您可以通过在 Swift 或 Objective-C 中设置相应的 GMSMapView
属性来停用 3D 建筑,如下所示:
Swift
mapView.isBuildingsEnabled = false
Objective-C
[mapView setBuildingsEnabled:NO];
地图内边距
Google 地图被设计成填满 GMSMapView
所定义的整个区域。地图外观和行为的若干方面都由视图的尺寸定义:
- 摄像头的目标反映含内边距的区域的中心。
- 地图控件以地图边缘为参照物进行定位。
- 版权声明或 Google 徽标等法律信息沿地图底部边缘显示。
您可以利用 GMSMapView
.padding
属性。地图将继续填充整个容器,但文本和控件定位、地图手势以及相机移动将呈现出将地图置于较小空间时的行为。这会导致出现以下变化:
- 使用 API 调用或按下按钮(例如罗盘按钮、“我的位置”按钮)进行的镜头移动会变成相对于内边距区域的移动。
GMSMapView
.projection
返回的投影将只包括带有内边距的区域。- 界面控件会按指定的点数从容器边缘偏移。
设计与地图的某些部分重叠的界面时,内边距会很有用。例如,在下图中,地图沿顶部边缘和右侧边缘设置了内边距。可见地图控件和法律文本将沿带有内边距的区域的边缘显示(显示为绿色),而地图仍将继续填充整个容器(显示为蓝色)。在此示例中,您可以让菜单悬浮在地图右侧的上方,这样不会遮盖住地图控件。
如需向地图添加内边距,请创建一个 UIEdgeInsets
对象,并将其传递给 GMSMapView
。padding
属性。
Swift
// Insets are specified in this order: top, left, bottom, right let mapInsets = UIEdgeInsets(top: 100.0, left: 0.0, bottom: 0.0, right: 300.0) mapView.padding = mapInsets
Objective-C
// Insets are specified in this order: top, left, bottom, right UIEdgeInsets mapInsets = UIEdgeInsetsMake(100.0, 0.0, 0.0, 300.0); mapView.padding = mapInsets;
地图配色方案
对于类型为“普通”和“地形”的地图,您可以将地图配色方案设置为深色、浅色,也可以使用当前的系统设置。例如,您可以根据时间或设备是在室内还是室外使用来深浅地调整地图配色方案。
使用 GMSMapView
overrideUserInterfaceStyle:
设置和更新地图配色方案。
Swift
let options = GMSMapViewOptions() // Map is init to use light mode by default. let mapView = GMSMapView(options: options) // Set map to use dark mode. mapView.overrideUserInterfaceStyle = .dark // Set map to use light mode. mapView.overrideUserInterfaceStyle = .light // Set map to use dark/light mode based on the value of traitCollection.userInterfaceStyle mapView.overrideUserInterfaceStyle = .unspecified
Objective-C
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; // Map is init to always use light mode. GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; // Set map to use dark mode. mapView.overrideUserInterfaceStyle = UIUserInterfaceStyleDark; // Set map to use light mode. mapView.overrideUserInterfaceStyle = UIUserInterfaceStyleLight; // Set map to use dark/light mode based on the value of traitCollection.userInterfaceStyle mapView.overrideUserInterfaceStyle = UIUserInterfaceStyleUnspecified;