如何在iOS上的GoogleMaps上制作Marker会改变它在没有动画的位置

时间:2017-09-20 05:40:10

标签: ios swift google-maps google-maps-sdk-ios

我正在使用GoogleMaps开发GPS跟踪应用程序以使用地图。

现在我正在处理简单的功能,假设有一个滑块,当我们移动滑块时,地图上的标记会移动对应于标记。

我得到了我想做的事,但只有一个小问题。

此代码可以更改标记的位置 -

marker.position = positionArray[valueFromSlider]

我使用此方法遇到的唯一问题是Marker在动画中移动它在正常用例场景中看起来非常好但是出现的问题是如果有人滑动滑块太频繁那么标记不会跟随正确的路径,即。Polyline

因为遵循正确的路径是必需的,所以我尝试从地图中删除标记并再次将其放在地图上,但它看起来非常生涩,每当调用方法时(滑块移动)我都通过以下代码完成它

marker = nil
marker.position = newPosition
marker.map = mapView
mapView.animate(to: GMSCameraPosition(target: newPosition, zoom: 13, bearing: 0, viewingAngle: 0))

和我试过的另一种方式就是这种方式我在这里粘贴实际的代码这样结果比上面的那个更好但不是理想的我意味着它比上面的稍微好一些

func jumpToNext(location: CLLocationCoordinate2D){
mapView.clear()
remap(location: location)
mapView.animate(to: GMSCameraPosition(target: newPosition, zoom: 13, bearing: 0, viewingAngle: 0))
}

这是remap功能

的声明
    func setMarkerOnMap(location: CLLocationCoordinate2D){
    marker = nil
    marker = GMSMarker(position: location)
    marker.map = bottomMap
    path.add(location)
    path = GMSMutablePath()
    for (index, locationB) in subTrips.enumerated(){
        path = GMSMutablePath()
        var polylineColor = UIColor()
        switch locationB.speed {
        case 0..<20:
            polylineColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 1)
        case 20..<40:
            polylineColor = UIColor(colorLiteralRed: 0, green: 162/255, blue: 232/255, alpha: 1)
        case 40..<60:
            polylineColor = UIColor(colorLiteralRed: 34/255, green: 117/255, blue: 76/255, alpha: 1)
        case 60..<80:
            polylineColor = UIColor(colorLiteralRed: 255/255, green: 255/255, blue: 0, alpha: 1)
        case 80..<100:
            polylineColor = UIColor(colorLiteralRed: 255/255, green: 165/255, blue: 0/255, alpha: 1)
            print("crossed 80 at index ", index)
        default:
            polylineColor = UIColor(colorLiteralRed: 237/255, green: 28/255, blue: 36/255, alpha: 1)
            print("crossed 100 at index ", index)
        }

        if index == 0{
            path.add(CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude))
            path.add(CLLocationCoordinate2D(latitude: locationB.latitude, longitude: locationB.longitude))
        } else{
            path.add(CLLocationCoordinate2D(latitude: subTrips[index - 1].latitude, longitude: subTrips[index - 1].longitude))
            path.add(CLLocationCoordinate2D(latitude: locationB.latitude, longitude: locationB.longitude))
        }

        var polyline = GMSPolyline()
        polyline.path = self.path
        polyline.map = self.bottomMap
        polyline = GMSPolyline(path: path)
        polyline.strokeColor = polylineColor

        polyline.geodesic = true
        polyline.strokeWidth = 2.0
        polyline.map = bottomMap

    }

}

现在我想要实现的是,当我更改标记的位置时,它会消失,然后出现在新位置,而不会在地图上设置动画。

3 个答案:

答案 0 :(得分:2)

如果我们移除标记怎么办 使用

marker.map = nil 

并在新位置添加新标记,这将解决您的问题..

func jumpToNext(location: CLLocationCoordinate2D){
        marker.map = nil
        remap(location: location)
        mapView.animate(to: GMSCameraPosition(target: newPosition, zoom: 13, bearing: 0, viewingAngle: 0))
}
func remap (location: CLLocationCoordinate2D){
        marker = GMSMarker(position: location)
        marker.map = bottomMap
       //other stuff you want to do you can do that here
}

这应解决你的动画问题..

答案 1 :(得分:0)

我知道这很旧了,但是我面临着同样的问题,我通过不使用标记就解决了这一问题,而是使用一个放置标记图像在GMSMapView上放置了固定的UIImageView。

每当我需要检索tha地图位置时,我都会从相机而不是标记中获取它:

    let latitude = mapView.camera.target.latitude
    let longitude = mapView.camera.target.longitude

答案 2 :(得分:-1)

GMSMarker具有opacity属性。您可以将其设置为0,然后设置新的position并再次将opacity设置为1(有一些延迟)。