Remplacer le point bleu dans GMSMapView par une flèche – Swift

J'utilise le Google SDK pour une application iOS8 (Swift). Je veux replace le point bleu (mon location) dans un GMSMapView par une flèche qui tourne en fonction de l'orientation du smartphone. Comment puis je faire ça?

MODIFIER :

J'ai réussi à voir ma flèche mais j'ai trois problèmes:

entrez la description de l'image ici

1: La flèche est coupée et je ne trouve pas comme agrandir la zone

2: La position de la flèche n'est pas exactement sur ma position Je résous ce problème en supprimant "0,5":

CGContextTranslateCTM(context, size.width, size.height) 

3: La direction de la flèche est symésortingque à l'original Je résous ce problème en ajoutant "-" avant "degrees":

 CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(-degrees)))) 

Comment résoudre ces problèmes?

Si vous utilisez Google Maps iOS SDK, il semble qu'il n'y ait aucun moyen de replace l'icône d'location par défaut de l'user. Cependant, l'icône par défaut comporte déjà une flèche indiquant le sens de l'user (appelez mapView.myLocationEnabled = true ).

Une solution de contournement consiste à placer un marqueur sur la position actuelle de l'user et à modifier l'image du marqueur en fonction de l'en-tête.

Exemple de code ( le code source complet ):

  func RadiansToDegrees(radians: Double) -> Double { return radians * 180.0/M_PI } func DegreesToRadians(degrees: Double) -> Double { return degrees * M_PI / 180.0 } var GeoAngle = 0.0 var locationManager = CLLocationManager() var marker = GMSMarker() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var camera = GMSCameraPosition.cameraWithLatitude(-33.86, longitude: 151.20, zoom: 6) var mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera) self.view = mapView marker.map = mapView locationManager.delegate = self locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation() locationManager.startUpdatingHeading() } func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) { var camera = GMSCameraPosition.cameraWithLatitude(newLocation.coordinate.latitude, longitude: newLocation.coordinate.longitude, zoom: 15) (self.view as GMSMapView).animateToCameraPosition(camera) GeoAngle = self.setLatLonForDistanceAndAngle(newLocation) marker.position = newLocation.coordinate } func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!) { var direction = -newHeading.trueHeading as Double marker.icon = self.imageRotatedByDegrees(CGFloat(direction), image: UIImage(named: "arrow.png")!) } func imageRotatedByDegrees(degrees: CGFloat, image: UIImage) -> UIImage{ var size = image.size UIGraphicsBeginImageContext(size) var context = UIGraphicsGetCurrentContext() CGContextTranslateCTM(context, 0.5*size.width, 0.5*size.height) CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(degrees)))) image.drawInRect(CGRect(origin: CGPoint(x: -size.width*0.5, y: -size.height*0.5), size: size)) var newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } func setLatLonForDistanceAndAngle(userLocation: CLLocation) -> Double { var lat1 = DegreesToRadians(userLocation.coordinate.latitude) var lon1 = DegreesToRadians(userLocation.coordinate.longitude) var lat2 = DegreesToRadians(37.7833); var lon2 = DegreesToRadians(-122.4167); var dLon = lon2 - lon1; var y = sin(dLon) * cos(lat2); var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon); var radiansBearing = atan2(y, x); if(radiansBearing < 0.0) { radiansBearing += 2*M_PI; } return radiansBearing; } 

L'étape key consiste à changer l'image en fonction du degré obtenu par la méthode func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!) .

Vous devez également vous assurer d'append NSLocationAlwaysUsageDescription et NSLocationWhenInUseUsageDescription dans votre file info.plist .

entrez la description de l'image ici

L'icône bleue par défaut de Google Maps dans iOS peut être masquée par le paramètre

 mapView.myLocationEnabled = FALSE;