2016-08-02 9 views
1

enter image description here複数の注釈を含む経路を作成しました。 添付されたスクリーンショットと同じアノテーションの間にテキストを表示したい。Googleマップとして経路上に時間を表示する方法

助けてもらえますか?

おかげ

+0

添付画像、添付画像と同じMKPolylineに時間のポップオーバーを表示する必要があります。あなたは誰にも考えがありますか? –

+0

別の注釈を特定の場所に追加しようとしましたか? – Wain

+0

@Wain返信ありがとうございます。はい、別の注釈を追加してみました。この後、viewForAnnotationは注釈(注釈と中点注釈の最初のセット)と予期しない結果を両方とも呼び出すことになります。 –

答えて

0

は、私はあなたがMKPolylineOverlayをタップしたときに2つの注釈の間の距離を表示しませんが、何かを試してみました。もう一つ重要なことは、私は基準を維持していないことです。

ここは私のコントローラの構造です。

import UIKit 
import MapKit 

class RouteViewController: UIViewController, MKMapViewDelegate { 

    @IBOutlet weak var mapView: MKMapView! 

    //Rest of the code see below 
} 

は、まず第一に、私は以下のようにのviewDidLoadデリゲートメソッドにマップするためのいくつかの注釈を追加します。 directionHandlerMethod

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.mapView.delegate = self 

    let annotation1 = MKPointAnnotation() 
    annotation1.title = "Times Square" 
    annotation1.coordinate = CLLocationCoordinate2D(latitude: 40.759011, longitude: -73.984472) 

    let annotation2 = MKPointAnnotation() 
    annotation2.title = "Empire State Building" 
    annotation2.coordinate = CLLocationCoordinate2D(latitude: 40.748441, longitude: -73.985564) 

    let annotation3 = MKPointAnnotation() 
    annotation3.title = "Some Point" 
    annotation3.coordinate = CLLocationCoordinate2D(latitude: 40.7484, longitude: -73.97) 

    let arrayOfPoints = [ annotation1, annotation2, annotation3] 
    self.mapView.addAnnotations(arrayOfPoints) 
    self.mapView.centerCoordinate = annotation2.coordinate 

    for (index, annotation) in arrayOfPoints.enumerate() { 
     if index < (arrayOfPoints.count-1) { 
      //I am taking the two consecutive annotation and performing the routing operation. 
      self.directionHandlerMethod(annotation.coordinate, ePoint: arrayOfPoints[index+1].coordinate) 
     } 
    } 
} 

、Iは

func directionHandlerMethod(sPoint: CLLocationCoordinate2D, ePoint: CLLocationCoordinate2D) { 
    let sourcePlacemark = MKPlacemark(coordinate: sPoint, addressDictionary: nil) 
    let destinationPlacemark = MKPlacemark(coordinate: ePoint, addressDictionary: nil) 
    let sourceMapItem = MKMapItem(placemark: sourcePlacemark) 
    let destinationMapItem = MKMapItem(placemark: destinationPlacemark) 

    let directionRequest = MKDirectionsRequest() 
    directionRequest.source = sourceMapItem 
    directionRequest.destination = destinationMapItem 
    directionRequest.transportType = .Automobile 
    let directions = MKDirections(request: directionRequest) 
    directions.calculateDirectionsWithCompletionHandler { 
     (response, error) -> Void in 
     guard let response = response else { 
      if let error = error { 
       print("Error: \(error)") 
      } 
      return 
     } 
     //I am assuming that it will contain one and only one result so I am taking that one passing to addRoute method 
     self.addRoute(response.routes[0]) 
    } 
} 

、以下のように方向に対する実際の要求を行っており次にIは、以下のようにaddRoute方法で

を地図上のポリラインのルートを追加してい
func addRoute(route: MKRoute) { 
    let polyline = route.polyline 

    //Here I am taking the centre point on the polyline and placing an annotation by giving the title as 'Route' and the distance in the subtitle 
    let annoatation = MKPointAnnotation() 
    annoatation.coordinate = MKCoordinateForMapPoint(polyline.points()[polyline.pointCount/2]) 
    annoatation.title = "Route" 
    let timeInMinute = route.expectedTravelTime/60 
    let distanceString = String.localizedStringWithFormat("%.2f %@", timeInMinute, timeInMinute>1 ? "minutes" : "minute") 
    annoatation.subtitle = distanceString 
    self.mapView.addAnnotation(annoatation) 

    self.mapView.addOverlay(polyline) 
} 

次は、レンダリング用のものを実装しています以下のようにrlayデリゲート方法、

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { 
    let renderer = MKPolylineRenderer(overlay: overlay) 
    renderer.strokeColor = UIColor.blueColor() 
    renderer.lineWidth = 2 
    renderer.lineCap = .Butt 
    renderer.lineJoin = .Round 
    return renderer 
} 

次はviewForAnnotationある重要なデリゲートメソッドです。ここでは、以下のように注釈の代わりにラベルを配置するような作業をしています。

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    if annotation.title != nil && annotation.title!! == "Route" { 
     let label = UILabel() 
     label.adjustsFontSizeToFitWidth = true 
     label.backgroundColor = UIColor.whiteColor() 
     label.minimumScaleFactor = 0.5 
     label.frame = CGRect(x: 0, y: 0, width: 100, height: 30) 
     label.text = annotation.subtitle ?? "" 
     let view = MKAnnotationView() 
     view.addSubview(label) 
     return view 
    } 
    return nil 
} 
関連する問題