【问题标题】:Is it possible to change Apple Map colors?是否可以更改 Apple 地图颜色?
【发布时间】:2013-08-29 09:02:46
【问题描述】:

我目前正在开发一个带有深色主题的 iOS 应用程序,并且非常希望将显示的 Apple 地图也设为深色。

我在 Google 上搜索了该主题并尝试通过情节提要更改组件的属性。但是,我找不到任何东西。

这甚至可能吗?我可以更改 Apple 地图组件的颜色...甚至只是反转颜色使其看起来很暗吗?

谢谢。

【问题讨论】:

  • 我不知道这里的任何答案是否有帮助:stackoverflow.com/questions/10354925stackoverflow.com/questions/13364374
  • 谢谢。但是,叠加看起来不像可以给 MKMap 一个黑色主题的东西。而且我真的很想继续使用 Apple Maps,而不是切换到 Google 或任何其他第三方提供商。
  • 我对自定义地图主题有同样的要求。你是怎么做到的?

标签: ios colors mapkit


【解决方案1】:

它有点笨拙和有限,但您可以在地图上放置一个黑色背景颜色和 alpha 小于 1.0(例如 0.3)的 UIView(确保关闭用户与此视图的交互,以便手势通过到地图),这会使整个事情变暗。有点笨拙,你会失去对比,但它可能值得一试。

【讨论】:

  • 这是个好主意。但这还不够……尤其是iOS7。我真的很想把它倒过来:/
  • @thedp 同意。我非常谨慎地建议它,所以希望我在上面发布的一些链接可能更有希望。遗憾的是,MapKit 并没有很好地做到这一点。
【解决方案2】:

如果不使用像 MapBox 这样的第三方提供商,您将无法做到这一点,至少在 iOS 6 及更低版本上是这样。

【讨论】:

  • MapBox 不是免费的。而且我找不到有关 Google 地图的信息。 Gmaps 是否支持深色主题?
【解决方案3】:

你可以创建MKTileOverlay的子类

class DarkModeMapOverlay: MKTileOverlay {
    init() {
        super.init(urlTemplate: nil)
        canReplaceMapContent = true
    }

    override func url(forTilePath path: MKTileOverlayPath) -> URL {
        let tileUrl = "https://a.basemaps.cartocdn.com/dark_all/\(path.z)/\(path.x)/\(path.y).png"
        return URL(string: tileUrl)!
    }
  }

然后在你的MKMapView 上设置覆盖

class MapViewController: UIViewController, MKMapViewDelegate {
    private var tileRenderer: MKTileOverlayRenderer?

    private var mapView: MKMapView {
        return view as! MKMapView
    }

    private func configureTileRenderer() {
        let darkModeOverlay = DarkModeMapOverlay()
        tileRenderer = MKTileOverlayRenderer(tileOverlay: darkModeOverlay)
        mapView.addOverlay(darkModeOverlay, level: .aboveLabels)
    }

    override func loadView() {
        view = MKMapView(frame: .zero)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate = self
        configureTileRenderer()
    }

    // MARK: MKMapViewDelegate
    func mapView(_: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        guard let renderer = self.tileRenderer else {
            return MKOverlayRenderer(overlay: overlay)
        }
        return renderer
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2012-10-31
    • 2011-06-24
    • 2020-11-07
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多