OpenStreetMap Tile-Overlay

在某些情况下,你可能不想使用 Apple 提供的默认地图。

你可以为包含自定义切片的 mapView 添加叠加层,例如 OpenStreetMap

让我们假设,self.mapView 是你已经添加到 ViewControllerMKMapView

首先,你的 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

如果你现在要运行项目,你会发现,你的地图仍会显示默认地图:

StackOverflow 文档

那是因为我们还没有告诉 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。如果你现在运行你的项目,你应该看到这样的地图:

StackOverflow 文档

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