Updated with Xcode 8.0 (Swift 3) on September 19, 2016.
Updated with Xcode 7.3.1 (Swift 2.2) on June 15, 2016.
Updated as a simple tutorial on May 25, 2015.
1. Disable 'Use Auto Layout' in the storyboard file inspector.
2. Drag a MapKit View to the storyboard.
3. Control-drag the MapKit View from the storyboard to ViewController.swift. Name the MapKit 'myMap'.
======
Previous Post (May 25, 2015):
import UIKit
Updated with Xcode 7.3.1 (Swift 2.2) on June 15, 2016.
Updated as a simple tutorial on May 25, 2015.
1. Disable 'Use Auto Layout' in the storyboard file inspector.
2. Drag a MapKit View to the storyboard.
3. Control-drag the MapKit View from the storyboard to ViewController.swift. Name the MapKit 'myMap'.
The result is:
@IBOutlet weak var myMap: MKMapView!
4. Complete the code as below:
Update (September 19, 2016): Xcode 8.0 (Swift 3)
======
Update (June 15, 2016): Xcode 7.3.1 (Swift 2.2)
Update (September 19, 2016): Xcode 8.0 (Swift 3)
import UIKit
import MapKit
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var myMap: MKMapView!
var myRoute : MKRoute!
override func viewDidLoad() {
super.viewDidLoad()
let point1 = MKPointAnnotation()
let point2 = MKPointAnnotation()
point1.coordinate = CLLocationCoordinate2DMake(25.0305, 121.5360)
point1.title = "Taipei"
point1.subtitle = "Taiwan"
myMap.addAnnotation(point1)
point2.coordinate = CLLocationCoordinate2DMake(24.9511, 121.2358)
point2.title = "Chungli"
point2.subtitle = "Taiwan"
myMap.addAnnotation(point2)
myMap.centerCoordinate = point2.coordinate
myMap.delegate = self
//Span of the map
myMap.setRegion(MKCoordinateRegionMake(point2.coordinate, MKCoordinateSpanMake(0.7,0.7)), animated: true)
let directionsRequest = MKDirectionsRequest()
let markTaipei = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point1.coordinate.latitude, point1.coordinate.longitude), addressDictionary: nil)
let markChungli = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point2.coordinate.latitude, point2.coordinate.longitude), addressDictionary: nil)
directionsRequest.source = MKMapItem(placemark: markChungli)
directionsRequest.destination = MKMapItem(placemark: markTaipei)
directionsRequest.transportType = MKDirectionsTransportType.automobile
let directions = MKDirections(request: directionsRequest)
directions.calculate(completionHandler: {
response, error in
if error == nil {
self.myRoute = response!.routes[0] as MKRoute
self.myMap.add(self.myRoute.polyline)
}
})
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let myLineRenderer = MKPolylineRenderer(polyline: myRoute.polyline)
myLineRenderer.strokeColor = UIColor.red
myLineRenderer.lineWidth = 3
return myLineRenderer
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
======
Update (June 15, 2016): Xcode 7.3.1 (Swift 2.2)
import UIKit
import MapKit
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var myMap: MKMapView!
var myRoute : MKRoute!
override func viewDidLoad() {
super.viewDidLoad()
let point1 = MKPointAnnotation()
let point2 = MKPointAnnotation()
point1.coordinate = CLLocationCoordinate2DMake(25.0305, 121.5360)
point1.title = "Taipei"
point1.subtitle = "Taiwan"
myMap.addAnnotation(point1)
point2.coordinate = CLLocationCoordinate2DMake(24.9511, 121.2358)
point2.title = "Chungli"
point2.subtitle = "Taiwan"
myMap.addAnnotation(point2)
myMap.centerCoordinate = point2.coordinate
myMap.delegate = self
//Span of the map
myMap.setRegion(MKCoordinateRegionMake(point2.coordinate, MKCoordinateSpanMake(0.7,0.7)), animated: true)
let directionsRequest = MKDirectionsRequest()
let markTaipei = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point1.coordinate.latitude, point1.coordinate.longitude), addressDictionary: nil)
let markChungli = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point2.coordinate.latitude, point2.coordinate.longitude), addressDictionary: nil)
directionsRequest.source = MKMapItem(placemark: markChungli)
directionsRequest.destination = MKMapItem(placemark: markTaipei)
directionsRequest.transportType = MKDirectionsTransportType.Automobile
let directions = MKDirections(request: directionsRequest)
directions.calculateDirectionsWithCompletionHandler({
response, error in
if error == nil {
self.myRoute = response!.routes[0] as MKRoute
self.myMap.addOverlay(self.myRoute.polyline)
}
})
}
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
let myLineRenderer = MKPolylineRenderer(polyline: myRoute.polyline)
myLineRenderer.strokeColor = UIColor.redColor()
myLineRenderer.lineWidth = 3
return myLineRenderer
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
======
Previous Post (May 25, 2015):
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var myMap: MKMapView!
var myRoute : MKRoute?
override func viewDidLoad() {
super.viewDidLoad()
var point1 = MKPointAnnotation()
var point2 = MKPointAnnotation()
point1.coordinate = CLLocationCoordinate2DMake(25.0305, 121.5360)
point1.title = "Taipei"
point1.subtitle = "Taiwan"
myMap.addAnnotation(point1)
point2.coordinate = CLLocationCoordinate2DMake(24.9511, 121.2358)
point2.title = "Chungli"
point2.subtitle = "Taiwan"
myMap.addAnnotation(point2)
myMap.centerCoordinate = point2.coordinate
myMap.delegate = self
//Span of the map
myMap.setRegion(MKCoordinateRegionMake(point2.coordinate, MKCoordinateSpanMake(0.7,0.7)), animated: true)
var directionsRequest = MKDirectionsRequest()
let markTaipei = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point1.coordinate.latitude, point1.coordinate.longitude), addressDictionary: nil)
let markChungli = MKPlacemark(coordinate: CLLocationCoordinate2DMake(point2.coordinate.latitude, point2.coordinate.longitude), addressDictionary: nil)
directionsRequest.setSource(MKMapItem(placemark: markChungli))
directionsRequest.setDestination(MKMapItem(placemark: markTaipei))
directionsRequest.transportType = MKDirectionsTransportType.Automobile
var directions = MKDirections(request: directionsRequest)
directions.calculateDirectionsWithCompletionHandler { (response:MKDirectionsResponse!, error: NSError!) -> Void in
if error == nil {
self.myRoute = response.routes[0] as? MKRoute
self.myMap.addOverlay(self.myRoute?.polyline)
}
}
}
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
var myLineRenderer = MKPolylineRenderer(polyline: myRoute?.polyline!)
myLineRenderer.strokeColor = UIColor.redColor()
myLineRenderer.lineWidth = 3
return myLineRenderer
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
Great!
ReplyDeletegood
ReplyDeleteonther let,long not work proper pls help
ReplyDeleteJust updated with Swift 2.2.
Deletethis class is not key value coding-compliant for the key mapView.
ReplyDeleteI didn't see this error with Xcode 8 (Swift 3).
DeleteHi, first I want to thank you for this tutorial. Second, I am wondering how do you draw a route from user's current location to a default destination?
ReplyDeleteHi, you may try replace one of the coordinates by the user's location.
DeleteHiee ,There is an error for
ReplyDeletedirectionsRequest.source = MKMapItem(placemark: markChungli) Error : (cannot assign to 'source' in 'directionsRequest')
directionsRequest.destination = MKMapItem(placemark: markTaipei) Error is : (cannot assign to 'destination' in 'directionsRequest')
Hi, I don't see this directionsRequest error with iOS 10.2.1 and Xcode 8.2.1.
Deletei have use 8.3 xcode swift 3. onther let,long not work proper plz give me answer soon?
ReplyDeleteI've just checked. The Swift 3 solution above still works with Xcode 8.3.1 and iOS 10.3.1.
Delete???????????????
ReplyDeletebt polyline is now creating.other lat long.plz ans.soon!
ReplyDeleteit is a apple map coding and apple map service does not working in india.
ReplyDeletehow to convert code in google map according.
How to remove root line in between location A to location B 60seconds updated ?
ReplyDelete