在某些情况下,您可能不想使用Apple提供的默认映射。
您可以向其中添加一个mapView包含自定义图块的覆盖图,例如来自OpenStreetMap的图块。
假设self.mapView您MKMapView是您已经添加到中的ViewController。
首先,您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)
要使用自定义映射,建议使用.aboveLabelsfor 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中有一个磁贴服务器列表。