OpenStreetMap Tile-Overlay
在某些情况下,你可能不想使用 Apple 提供的默认地图。
你可以为包含自定义切片的 mapView 添加叠加层,例如 OpenStreetMap 。
让我们假设,self.mapView 是你已经添加到 ViewController 的 MKMapView。
首先,你的 ViewController 需要符合协议 MKMapViewDelegate。
class MyViewController: UIViewController, MKMapViewDelegate
然后你必须将 ViewController 设置为 mapView 的代表
mapView.delegate = self
接下来,配置地图的叠加层。你需要一个 URL 模板。所有磁贴服务器上的 URL 都应该与此类似,即使你将离线存储地图数据:http://tile.openstreetmap.org/{z}/{x}/{y}.png
let urlTeplate = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: urlTeplate)
overlay.canReplaceMapContent = true
配置叠加后,必须将其添加到 mapView。
mapView.add(overlay, level: .aboveLabels)
要使用自定义地图,建议使用 .aboveLabels 作为 level。否则,默认标签将显示在自定义地图上。如果要查看默认标签,可以在此处选择 .aboveRoads。
如果你现在要运行项目,你会发现,你的地图仍会显示默认地图:

那是因为我们还没有告诉 mapView,如何渲染叠加层。这就是为什么你必须先设置委托的原因。现在你可以将 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer 添加到视图控制器:
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKTileOverlay {
let renderer = MKTileOverlayRenderer(overlay: overlay)
return renderer
} else {
return MKTileOverlayRenderer()
}
}
这将返回正确的 MKOverlayRenderer 到你的 mapView。如果你现在运行你的项目,你应该看到这样的地图:

如果要显示另一个地图,只需更改 URL 模板即可。OSM Wiki 中有一个 tile-servers 列表 。