1

我将 Google SDK 用于 iOS8 (Swift) 应用程序。我想用根据智能手机方向旋转的箭头替换 GMSMapView 中的蓝点(我的位置)。我怎样才能做到这一点?

编辑 :

我设法看到了我的箭头,但我遇到了三个问题:

在此处输入图像描述

1:箭头被剪掉了,我没有发现放大的区域

2:箭头的位置不完全在我的位置我通过删除“0,5”解决了这个问题:

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

3:箭头的方向与原来的对称我通过在“度”之前添加“-”来解决这个问题:

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

如何解决这些问题?

4

2 回答 2

4

如果您使用的是 Google Maps iOS SDK,似乎没有办法替换默认的用户位置图标。但是,默认图标已经有一个箭头来指示用户前进的方向(只需调用mapView.myLocationEnabled = true)。

一种解决方法是在用户的当前位置上放置一个标记,并根据标题更改标记图像。

示例代码(完整源代码):

    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;
    }

关键步骤是根据来自方法的度数来改变图像func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!)

您还需要确保在文件中添加NSLocationAlwaysUsageDescription和。NSLocationWhenInUseUsageDescriptioninfo.plist

在此处输入图像描述

于 2015-03-11T20:52:10.903 回答
0

iOS中谷歌地图默认的蓝色图标可以通过设置隐藏

mapView.myLocationEnabled = FALSE;
于 2015-09-01T08:24:56.647 回答