【问题标题】:How to make Marker on GoogleMaps in iOS change it's position without animation如何使 iOS 中 Google 地图上的标记在没有动画的情况下改变其位置
【发布时间】:2019-01-02 06:08:16
【问题描述】:

我正在开发一个 GPS 跟踪应用程序,使用 GoogleMaps 来使用地图。

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

我正在做我想做的事,但只是一个小问题。

标记的位置可以通过这段代码改变 -

marker.position = positionArray[valueFromSlider]

我使用这种方法面临的唯一问题是标记随着动画移动,它在正常用例场景中看起来非常好,但出现的问题是,如果有人过于频繁地滑动滑块,那么标记不会遵循正确的路径,即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

    }

}

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

【问题讨论】:

  • 我想要的是,当我改变标记的位置时,它不会以动画方式从当前位置消失并跳转到一个新位置,所以即使有人滑动得很快涵盖了两者之间的所有点。

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


【解决方案1】:

如果我们删除标记会怎样, 使用

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
}

这应该可以解决您的动画问题..

【讨论】:

    【解决方案2】:

    我知道这是旧的,但我遇到了同样的问题,我通过不使用标记来解决它,而是在 GMSMapView 上放置一个固定的 UIImageView 并使用放置标记图像。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 伙计,谢谢您的回答。但这不起作用,因为我面临的marker.location = newLocation 的问题是它没有正确设置动画。所以我只想删除动画。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2021-09-06
      相关资源
      最近更新 更多