2013-11-28 22 views
8

Ich bin auf der Suche nach einer Möglichkeit, einen benutzerdefinierten Map-Stil in iOS 7 zu implementieren, genau wie Sie mit Google Maps tun können. Ich habe einige Posts gefunden, die sagen, dass dies mit MapKit nicht möglich ist, aber sie wurden alle vor einer Weile gepostet. Um zu verdeutlichen, nach Stil, spreche ich über benutzerdefinierte Farben und vorzugsweise auch Schriften. Beispiel für einen benutzerdefinierten Google Map-Stil unten.Benutzerdefinierte Map-Stil in MapKit

http://www.servendesign.com/wp-content/uploads/2011/12/zaarley-custom-google-maps.jpg

ich wirklich würde es vorziehen, MapKit aus Leistungsgründen verwenden, aber wenn es nicht unterstützt wird, ich bin offen auch andere Frameworks zu verwenden. Die, die ich gesehen habe, sind MapBox und Cloudmade und natürlich das Google Maps SDK.

Gibt es eine Möglichkeit, dies mit MapKit zu tun? Wenn nicht, was ist der beste Weg zu gehen?

Antwort

8

MKMapView nicht die Eigenschaften, die Sie an der Anpassung interessiert sind. Das Google Maps SDK unterstützt benutzerdefinierte Farben und Symbole für Markierungen, die für Ihre Zwecke ausreichen.

Edit: Bleiben Sie dran für iOS 11, die diese Stufe der Anpassung bieten kann.

+0

Danke für die Eingabe. Wissen Sie, wie das Google Maps SDK im Vergleich zu nativem MapKit hinsichtlich der Leistung steht? –

+0

Ich bin keine Autorität, aber ich kann keinen großen Leistungsunterschied zwischen der Google Maps SDK-Demo-App und einer App mit MapKit feststellen. YMMV. – Marco

2

Eine weitere Option ist MBXMapKit, eine MapBox-Bibliothek, die auf Apples MapKit basiert, obwohl sie auf MapBox-Layer ausgerichtet ist. Es ist getrennt von der MapBox iOS SDK, die ein grundlegender Umschreiben ist, der wie MapKit funktioniert, aber nicht darauf basiert.

+0

Danke, ich werde mich darum kümmern. Mir gefällt, dass es auf MapKit basiert. –

15

MKMapView bietet auch die Möglichkeit, benutzerdefinierte Kachel-Overlays zu verwenden. Openstreetmap hat eine große Liste von Kachelservern, die Sie verwenden könnten, um eine benutzerdefinierte Karte zu erhalten. Natürlich besteht immer die Möglichkeit, ein eigenes Kachel-Overlay-Set zu erstellen. Der Prozess ist im Openstreetmap wiki here beschrieben.

Eine mögliche Implementierung in Swift könnte wie folgt aussehen:

1. Import MapKit

import MapKit 

2. Overlays hinzufügen

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

3. Konform zur Karte zu MKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate { ... } 

4. Delegatmethode Implementieren Sie die richtigen Renderer zu verwenden, um die Fliesen

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

Im obigen Beispiel angezeigt overlayURL von der Kachel-Server-Liste auf Openstreetmap gefunden genommen wird: OpenstreetMap Tile Servers.

Zum Beispiel, wenn Sie die Staubblatt Karte verwenden möchten Ihre URL würde so aussehen (die ein Aquarell-Stil hat):

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

Wenn Sie suchen eine dunkel Modus Karte mit besten Sie wahrscheinlich gehen Carto Dark: http://a.basemaps.cartocdn.com/dark_all/${z}/${x}/${y}.png.

Sehen Sie, dass die oben genannten URLs keine SSL-Unterstützung (HTTP) hat.Daher müssen Sie unsichere HTTP-Anfragen für diese spezifische URL erlauben, indem Sie die in Ihrer Info.plist hinzufügen. Weitere Informationen finden Sie unter this link.

+0

Hallo @dehlen, danke für diese hilfreiche Antwort. Quick F: wo in meinem MapViewController ich diesen Code (insbesondere den Block in Punkt 2, wie ich roten Fehler msgs bekomme, wo immer ich es. –

+0

@DimitriT können Sie es in Ihre ViewDidLoad func zum Beispiel setzen. – dehlen

+0

danke Dehlen: Wenn Sie so freundlich sein mögen, einem Anfänger wie mir zu erklären, welchen Code ich hinzufügen soll, um die mapViewModel-Klasse zu bekommen, da bekomme ich den Fehler 'Verwendung von unaufgelöstem Identifikator MapViewModel' Ich nehme an, ich füge ein neues hinzu swift datei, frage mich, wie ich das hinzufügen kann.Sie haben einfach den Überblick über die Karten und Anmerkungen - Tipps für diesen Kurs wären eine große Hilfe –