在didupdatelocation内部运行的Mapview不会让用户在地图上滚动

时间:2018-08-01 11:09:42

标签: ios swift google-maps cllocationmanager

我有一个Google Map视图,每次位置管理器收到更新的位置时,该视图都以用户位置为中心。但是,我希望用户能够自由地在地图上平移/缩放,而相机位置不会每秒左右跳回到用户位置。

我将.isMyLocationEnabled设置为false,因为我设计了代表用户位置的自定义图标(在我的情况下为船)。

此外,我已经创建了自己的按钮,以允许用户平移回用户的上一个位置(由于上述原因,我没有使用内置的Google位置按钮)。该代码未包含在示例代码中,但可以正常工作。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

if let location = locations.last {

self.camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 15)
self.mapViewHere.isMyLocationEnabled = false // don't want the standard blue dot or location button
self.mapViewHere.camera = self.camera

/// plot our custom GMSMarker here
let currentPosition = GMSMarker()
currentPosition.map = nil // clear the last location
currentPosition = GMSMarker(position: location.coordinate)
currentPosition.icon = myCustomMarker.png
currentPosition.rotation = (locationManager.location?.course)!
currentPosition.map = self.mapViewHere


      } // end locations.first
}// end location manager

因为我正在使用在didUpdateLocations中调用的自定义GMSMarker绘制用户位置,所以我不认为停止更新功能将是答案,因为即使用户缩放/平移,我也希望继续这样做。

总而言之;是否可以显示最初以用户位置为中心(并随设备移动而更新)的地图,但是每当用户在didViewLocations触发后在地图视图中平移/缩放时,不应自动返回用户位置吗?通过按下自定义按钮,用户应该能够触发返回初始状态。

我正在使用Xcode和Swift 4开发应用程序。

1 个答案:

答案 0 :(得分:0)

在珀斯iOS开发人员小组的指导下解决了我的问题;

首先定义一个布尔变量;

var auto: Bool = true

收听用户操作并相应地调整变量:

 func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
    if gesture {
        self.auto = false
        print("map view moved, self.auto set to \(self.auto)")
    }
}

并且在didUpdateLocation触发时,在locationManager didUpdateLocation中使用此变量可有效忽略用户位置处的地图重绘。

if self.auto {
      print("self.auto is true, back to auto-camera-tron")

    self.camera = GMSCameraPosition.camera(withLatitude: location.coordinate.latitude, longitude: location.coordinate.longitude, zoom: 15)
}

只要在if self.auto之前声明,我的自定义位置图标将继续在didUpdateLocation上绘图

最后,我可以将我的自定义位置按钮设置为以用户位置为中心,只需更改self.auto = true