私は、ユーザーの場所とマーカーの間にルートを描くアプリケーションを持っています。それはうまくいきますが、ユーザーがその場所を変更して他のマーカーを押すと、ルートは最初の場所から描画されます。ユーザーの場所をボタンで更新し、迅速に経路を描く
これは論理です。関数locationManagerは、バッテリを節約するために更新場所を停止していました。これは、コードでした:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
userLocation = locations[0]
long = userLocation.coordinate.longitude;
lat = userLocation.coordinate.latitude;
locationManager.stopUpdatingLocation()
if let location = locations.first {
mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 14, bearing: 0, viewingAngle: 0)
}
}
それから私は、ユーザーのロケーションを更新し、ポリラインを再描画するためのボタンを作成します。
@IBAction func ActualizarLocalizacion(sender: AnyObject) {
locationManager.startUpdatingLocation()
originAddresslong = "\(userLocation.coordinate.longitude)"
originAddresslat = "\(userLocation.coordinate.latitude)"
if markerLocation == nil
{markerLocation = userLocation.coordinate
}
destinationAddresslong = "\(markerLocation.longitude)"
destinationAddresslat = "\(markerLocation.latitude)"
var directionsURLString = baseURLDirections + "origin=" + originAddresslat + "," + originAddresslong + "&destination=" + destinationAddresslat + "," + destinationAddresslong + "&key=MyKey"
directionsURLString = directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
let directionsURL = NSURL(string: directionsURLString)
Alamofire.request(.GET, directionsURL!, parameters: nil).responseJSON { response in
switch response.result {
case .Success(let data):
var json = JSON(data)
print(json)
let errornum = json["error"]
if (errornum == true){
}else{
//NSThread.sleepForTimeInterval (2)
var routes = json["routes"].array
if routes != nil{
var overViewPolyLine = routes![0]["overview_polyline"]["points"].string
print(overViewPolyLine)
if overViewPolyLine != nil{
if self.routePolyline != nil {
self.routePolyline.map = nil
self.routePolyline = nil
}
let path = GMSMutablePath(fromEncodedPath: overViewPolyLine)
self.routePolyline = GMSPolyline(path: path)
self.routePolyline.strokeWidth = 5
self.routePolyline.strokeColor = UIColor.blueColor()
self.routePolyline.map = self.mapView
overViewPolyLine = nil
routes = nil
json = nil
}
}
}
case .Failure(let error):
print("Hubo un problema con el servidor de direcciones: \(error)")
}
}
}
私はその後、私はボタンを3回押さなければならないことがわかり(!!!)正しい再描画のために。私は、コード
locationManager.startUpdatingLocation()
NSThread.sleepForTimeInterval (2)
を使用しているし、私は2回をプッシュする必要がありますが、私はそれが起こっている理由を知りません。私はこれがプロセスの時間の問題でなければならないと思うが、これをどのように処理するのか分からない。
ユーザーがマーカーをタップしたときに使用する関数は同じです(式と変数)。この場合、1回押すだけで済みます。
ありがとうございます。
P.D:
これらの私の輸入です:
import UIKit
import GoogleMaps
import SRKUtility
import SRKRequestManager
import Alamofire
import SwiftyJSON
そして、これは私のmarkerLocation変数です:
func mapView(mapView: GMSMapView!, didTapMarker marker: GMSMarker!) -> Bool {
markerLocation = marker.position;
}