MK路线请求-未显示方向线

时间:2018-08-21 00:15:30

标签: ios mapkit

我已经成功实现了兴趣点的位置和我的位置。两者都显示。现在,我想计算两点之间的路线,并应显示一条蓝线。不幸的是,当我单击按钮时,没有显示任何行。

我非常感谢您的帮助/提示。非常感谢。

import UIKit
import MapKit

class MapViewController: UIViewController, MKMapViewDelegate
{
    //outlet variable is used for establishing a connection with the 
 // map view in the storyboard

@IBOutlet var mapView: MKMapView!

var spot = Spot()
let locationManager = CLLocationManager()
var currentPlacemark:CLPlacemark?// it is used to save the selected spot

override func viewDidLoad()
{
    super.viewDidLoad()
    //request for a user's authorization for lacation services
    locationManager.requestWhenInUseAuthorization()
    let status = CLLocationManager.authorizationStatus()

    if status == CLAuthorizationStatus.authorizedWhenInUse
    {
        mapView.showsUserLocation = true
    }
    let geoCoder = CLGeocoder()
    geoCoder.geocodeAddressString(spot.location,
    completionHandler:
        { placemarks, error in
        if let error = error {
            print(error)
            return
        }

        if let placemarks = placemarks{
            //get the first placemark
            let placemark = placemarks[0]

            // value of current Placemark
            self.currentPlacemark = placemark

            // add annotation
            let annotation = MKPointAnnotation()
            annotation.title = self.spot.name
            annotation.subtitle = self.spot.type

            if let location = placemark.location{
                annotation.coordinate = location.coordinate

                //display the annotation
                self.mapView.showAnnotations([annotation],animated:true)
                self.mapView.selectAnnotation(annotation, animated: true)
            }
        }
    })

    mapView.showsCompass = true
    mapView.showsTraffic = true
    mapView.showsScale = true

    // we want to show the users location
    mapView.showsUserLocation = true
   }

@IBAction func showDirection(sender:AnyObject)
{
    // we make sure if current placemark contains a value using a guard statement. Otherwise just
    // skip everything
    guard let currentPlacemark = currentPlacemark else
    {
        return
    }
    // creating an instance of MKDirectionsRequest to request directions
    let directionRequest = MKDirectionsRequest()

    // set the source(where the user currently is) and destination of the route
    directionRequest.source = MKMapItem.forCurrentLocation()// retrieving the current location

    let destinationPlacemark = MKPlacemark(placemark:currentPlacemark)
    directionRequest.destination = MKMapItem(placemark: destinationPlacemark)
    directionRequest.transportType = MKDirectionsTransportType.automobile// later change for transit

    // calculate the direction
    let directions = MKDirections(request: directionRequest)

    // this method initiates an asynchronous request for directions and calls
    // your completion handler when the request is conpleted. The MKDirections object
    //passes my request to the Apple servers ans asks for route-based directions data
    directions.calculate { (routeRepsonse, routeError) -> Void in

            guard let routeResponse = routeRepsonse else
            {
                if let routeError = routeError
                {
                    print("Error:\(routeError)")
                }

            return

            }

        let route = routeRepsonse?.routes[0]// provides a container for saving the route information so that the routes are saved in the routes property

        // The detailed route geometry is e.g. route.polyline is represented by an MKPolyline object
        // the add level method is used to add an MKPolyline object to the existing map view
        self.mapView.add((route?.polyline)!,level: MKOverlayLevel.aboveRoads)

            }
}


// implementing a mapView method which draws the route
func mapView(_mapView:MKMapView,rendererFor overlay: MKOverlay) -> MKOverlayRenderer
{
    let renderer = MKPolylineRenderer(overlay: overlay)
    renderer.strokeColor = UIColor.blue
    renderer.lineWidth = 3.0

    return renderer
 }


override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
    // Dispose of any resources hat can be recreated.
}

}

1 个答案:

答案 0 :(得分:0)

也许委托方法名称错误。重命名

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

使用

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