Сейчас я изучаю 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, ничего не помогает ....