Как запустить локальные тайлы в MKMapView Xcode без онлайн-карты? - PullRequest
0 голосов
/ 23 января 2020

Сейчас я изучаю MKMapView и застрял с проблемой. Мне нужен ViewController с MKMapView, который будет загружать плитки карты, установленные локально. Для этого я написал два класса:

import UIKit
import MapKit

class MapViewController: UIViewController {


  @IBOutlet weak var mapView: MKMapView!

  var tileRenderer: MKTileOverlayRenderer!

  override func viewDidLoad() {
    super.viewDidLoad()

    setupTileRenderer()

    let initialRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 40.774669555422349, longitude: -73.964170794293238),
                                           span: MKCoordinateSpan(latitudeDelta: 0.16405544070813249, longitudeDelta: 0.1232528799585566))
    mapView.region = initialRegion
    mapView.delegate = self

  }


  func setupTileRenderer() {

    let overlay = AdventureMapOverlay()

    overlay.canReplaceMapContent = true
    mapView.addOverlay(overlay, level: .aboveLabels)
    tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
  }


}

extension MapViewController: MKMapViewDelegate {
  func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    return tileRenderer
  }

}

И код, который генерирует мои плитки:

import Foundation
import MapKit

// Add AdventureMapOverlay class here:
class AdventureMapOverlay: MKTileOverlay {

  override func url(forTilePath path: MKTileOverlayPath) -> URL {

    let tilePath = Bundle.main.url(
      forResource: "\(path.y)",
      withExtension: "png",
      subdirectory: "tiles/\(path.z)/\(path.x)",
      localization: nil)

    guard let tile = tilePath else {

      return Bundle.main.url(
        forResource: "parchment",
        withExtension: "png",
        subdirectory: "tiles",
        localization: nil)!
    }
    return tile
  }
}

Это работает, но с одной ошибкой, которую я не могу исправить. Перед рендерингом моих плиток MKMapView загружает карту из Apple и переносит ее поверх моих плиток. Тогда рендерит мои плитки только после ZoomIN / OUT или другого взаимодействия с пользователем. Как я могу удалить загрузку Apple Map в MKMapView?

Я читаю решение из здесь , и там, где я строю окончательный проект, у него та же проблема. Но когда я создаю новый проект с нуля и добавляю туда эти два класса, MKMapView начинает работать с локальными плитками. Я пытаюсь сделать все в моем проекте, скопировать код, создать новый с нуля, изучить параметры проекта, перенести его в Swift 5, ничего не помогает ....

...