Saneth Chandrasekara
Saneth Chandrasekara

Reputation: 471

Polyline won't show up in MapKit

I'm using Xcode 8.3.2 so first I import mapkit. Then I set markers to the map. Then I add the following code to add a polyline to the map but it won't show any.

class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
     self.mapView.delegate = self
    super.viewDidLoad()
    let template = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
        let point1 = CLLocationCoordinate2D(latitude: 6.9271, longitude: 79.8612);
        let point2 = CLLocationCoordinate2D(latitude: 9.6615, longitude: 80.0255);

            let overlay = MKTileOverlay(urlTemplate: template)
            overlay.canReplaceMapContent = true
            let location = CLLocationCoordinate2DMake(6.878069, 79.892119)
            mapView.add(overlay, level: .aboveLabels)
            mapView.setRegion(MKCoordinateRegionMakeWithDistance(location, 1100, 1100), animated: true)
            let pin = PinAnnotation(title: "Nimbus", subtitle: "Best", coordinate: location)
            mapView.addAnnotation(pin)



        let points: [CLLocationCoordinate2D]
        points = [point1, point2]

        let polyline = MKGeodesicPolyline(coordinates: points, count: 3)
        mapView.add(polyline)
        UIView.animate(withDuration: 1.5, animations: { () -> Void in
            let span = MKCoordinateSpanMake(0.01, 0.01)
            let region1 = MKCoordinateRegion(center: point1, span: span)
            self.mapView.setRegion(region1, animated: true)
        })
       }
 func mapView(_ mapview: MKMapView, rendererFor overlay: MKOverlay) ->MKOverlayRenderer{
                    if let overlayGeodesic = overlay as? MKGeodesicPolyline
                    {
                        let overLayRenderer = MKPolylineRenderer(polyline: overlayGeodesic)
                        overLayRenderer.lineWidth = 5
                        overLayRenderer.strokeColor = UIColor.blue
                        return overLayRenderer

                    }
        return MKOverlayRenderer(overlay: overlay)
                }

Upvotes: 2

Views: 1616

Answers (1)

Reinier Melian
Reinier Melian

Reputation: 20804

First you need to add this line, I think you already have added but anyway

    self.mapView.delegate = self

After that you need to implement this MKMapViewDelegate method func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer and return the MKOverlayRenderer needed for your current overlay in this case MKPolylineRenderer this is an important part if you don't implement this method then you never will have your polyline rendered

implementation will be something like this

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    if let overlayGeodesic = overlay as? MKGeodesicPolyline
    {
        let overLayRenderer = MKPolylineRenderer(polyline: overlayGeodesic)
        overLayRenderer.lineWidth = 5
        overLayRenderer.strokeColor = UIColor.blue
        return overLayRenderer
    }

    if let overlayTile = overlay as? MKTileOverlay{
        let overLayRenderer = MKTileOverlayRenderer(tileOverlay: overlayTile)
        return overLayRenderer
    }

   return MKOverlayRenderer(overlay: overlay)
}

And voila! there is your polyLine rendered

enter image description here

Upvotes: 1

Related Questions