2016-07-04 13 views
2

Ich habe eine MKMapView in einer IOS App mit Cache-lokalen Kacheln, die gut funktioniert. Kann zoomen, sich bewegen, etc ...MapView mit Polyline oder Annotation verlieren Kachel auf Zoom

Wenn ich jedoch entweder Annotation oder eine Polylinie hinzufüge, funktioniert es immer noch gut, bis Zoom zu einer bestimmten Zoomstufe kommt, dann die Kacheln unter den Anmerkungen und Polylinien nicht auftauchen, aber allen anderen geht es gut.

zoomed out at the right level

Zoomed in one two many levels.

Wenn ich die Anmerkungen/Linien zu entfernen, zoomt die Karte korrekt in und funktioniert gut für den Bereich der Anmerkungen/Linien in. Irgendwelche Ideen

gewesen wären?

Ich reduzierte dies auf den kleinsten Testfall. Dies funktioniert bis zum Vergrößern, dann verschwinden alle Kacheln unter der Polylinie. Verkleinern Sie sie und sie erscheinen wieder.

import Foundation 
import UIKit 
import MapKit 

class MyController: UIViewController, MKMapViewDelegate { 
    @IBOutlet weak var mapView: MKMapView! 
    var overlay:MKTileOverlay = MKTileOverlay(URLTemplate: "https://services.arcgisonline.com/ArcGIS/rest/services/USA_Topo_Maps/MapServer/tile/{z}/{y}/{x}.jpg"); 

override func viewDidLoad() { 
    mapView.delegate = self 
    mapView.showsUserLocation = true; 
    overlay.maximumZ = 15; 
    overlay.minimumZ = 12; 
    overlay.canReplaceMapContent = true 
    mapView.addOverlay(overlay) 

    var points: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]() 

    points.append(CLLocationCoordinate2D(latitude: 40.7608, longitude: -111.8910)); 
    points.append(CLLocationCoordinate2D(latitude: 40.8894, longitude: -111.8808)); 

    var polyline = MKPolyline(coordinates: &points, count: points.count) 
    mapView.addOverlay(polyline) 
    let region = MKCoordinateRegion(center: points[0], span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)) 
    mapView.setRegion(region, animated: false) 
} 


func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { 
    if overlay is MKPolyline { 
     var polylineRenderer = MKPolylineRenderer(overlay: overlay) 
     polylineRenderer.strokeColor = UIColor.blueColor() 
     polylineRenderer.lineWidth = 5 
     return polylineRenderer 
    } else if (overlay is MKTileOverlay) { 
     let renderr = MKTileOverlayRenderer(overlay: overlay) 
     return renderr 
    } 

    return nil 
} 
} 

Antwort

1

Ich sehe, dass es drei Monate her, seit Sie diese Frage gestellt, aber es ist immer noch von Interesse für den Fall, werde ich teilen, was ich gefunden habe.

Ich habe die Möglichkeit hinzugefügt, Map-Kacheln von Apple mit einem MKMapSnapshotter herunterzuladen und sie in einem Satz von Kacheln-Verzeichnissen zu speichern, um sie außerhalb von Mobilfunk-Servicebereichen zu verwenden, was ziemlich gut funktioniert. Die Verzeichnisse decken 3 bis 6 verschiedene Zoomstufen ab, abhängig von einer Benutzerauswahl, wobei die Kachelbilder in Unterverzeichnissen unter Verzeichnissen angeordnet sind, die nach ihren Zoomstufen benannt sind, gemäß dem iOS-Standard.

Wenn diese mit einem MKTileOverlayRenderer angezeigt werden, wird zwischen den Bildern für Zoomstufen zwischen den Min- und Max-Zoomstufen, die in MKMapRectMake für das MKTileOverlay-Objekt festgelegt wurden, entsprechend umgeschaltet.

Die Karte zeigt alle Kacheln in allen angegebenen Zoomstufen entsprechend an und kleistert die Kacheln nach, wenn sich die Größe ändert. Wenn die Anzeige über die Maximal- oder Minimalwert-Zoomstufen hinausgeht, werden die Kacheln eine Zeit lang entweder aus der Maximal- oder der Min-Zoomstufe angezeigt, da für die neuen Größen keine Kachelbilder vorhanden sind. Dies funktioniert OK, wenn keine Polylinien vorhanden sind, aber das System zeichnet die Quadrate neu, die unter Polylinien liegen, um die Größe der Linien zu ändern, und wenn es dies tut, löscht es die Kachelbilder und sucht nach den Kacheln für die neue Zoomstufe. Da diese Kacheln nicht vorhanden sind, werden diese Quadrate leer auf der Kacheln-Ebene aufgefunden, obwohl Quadrate, die nicht von Polylinien überlappt werden, nicht gelöscht werden und somit die alten Bilder erhalten bleiben.

Übrigens, Sie haben vielleicht schon einmal darauf gestoßen, aber falls nicht, müssen Sie MKTileOverlay von der Unterklasse ableiten, damit Sie den Ort und die Größe des durch die Kacheln gemappten Bereichs festlegen können.

Hoffe all dies hilft, Dinge zu erklären, auch wenn es nicht unbedingt das Problem löst, was Sie tun wollen.