13

我正在寻找一种在 iOS 7 中实现自定义地图样式的方法,就像您可以使用Google Maps一样。我发现一些帖子说 MapKit 无法做到这一点,但它们都是不久前发布的。澄清一下,按风格,我说的是自定义颜色,最好还有字体。下面是自定义 Google 地图样式的示例。

在此处输入图像描述
(来源:servendesign.com

出于性能原因,我真的更喜欢使用 MapKit,但如果不支持它,我也愿意使用其他框架。我见过的是 MapBox 和 Cloudmade,当然还有 Google Maps SDK。

有没有办法用 MapKit 做到这一点?如果没有,最好的方法是什么?

4

3 回答 3

18

MKMapView 还提供了使用自定义图块覆盖的可能性。Openstreetmap 有一个很棒的瓦片服务器列表,您可以使用它来获取自定义地图。当然,总是有可能创建自己的图块覆盖集。该过程在此处的 Openstreetmap wiki 中进行了描述。

Swift 中的一个可能实现如下所示:

1.导入MapKit

import MapKit

2.添加覆盖到地图

let overlayPath = self.mapViewModel.overlayURL
let overlay = MKTileOverlay(URLTemplate: overlayPath)
overlay.canReplaceMapContent = true
self.mapView.addOverlay(overlay)

3.符合MKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate { ... }

4.实现委托方法以使用正确的渲染器来显示瓷砖

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    guard let tileOverlay = overlay as? MKTileOverlay else {
        return MKOverlayRenderer(overlay: overlay)
    }
    return MKTileOverlayRenderer(tileOverlay: tileOverlay)
}

在上面的示例中,overlayURL 取自 openstreetmap 上的切片服务器列表:OpenstreetMap Tile Servers

例如,如果您想使用雄蕊图(具有水彩风格),您的网址将如下所示:

let overlayURL = "http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg"

如果您正在搜索深色模式地图,您可能最好使用 Carto Dark: http://a.basemaps.cartocdn.com/dark_all/${z}/${x}/${y}.png

看到上面的 URL 没有 SSL 支持 (HTTP)。因此,您需要通过App Transport Security Settings在 Info.plist 中添加 来允许对这个特定 URL 的不安全 HTTP 请求。有关更多信息,请查看此链接

于 2016-08-02T14:01:39.170 回答
8

MKMapView不会公开您有兴趣自定义的属性。Google Maps SDK 确实支持标记的自定义颜色和图标,这可能足以满足您的目的。

编辑:请继续关注 iOS 11,它可能会提供这种级别的自定义。

于 2013-11-28T21:23:11.113 回答
2

另一个选择是MBXMapKit,它是一个构建在 Apple 的 MapKit 之上的 MapBox 库,尽管它适用于 MapBox 层。它与MapBox iOS SDK是分开的,后者是一种全新的重写,旨在像 MapKit 一样工作,但不是基于它。

于 2013-12-02T20:00:17.150 回答