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 列表 。