我有一个谷歌地图视图,每当位置经理收到更新的位置时,它都会以用户位置为中心。然而,我希望用户能够在地图上自由平移/缩放,而不会让相机位置每隔一秒左右跳回用户位置
我已经将.isMyLocationEnabled设置为false,因为我已经设计了一个自定义图标(在我的情况下是一艘飞船(来表示用户的位置。
此外,我创建了自己的按钮,允许用户平移回用户的最后位置(出于上述原因,我没有使用谷歌内置的位置按钮(。示例代码中没有包含这一点,但它确实可以正常工作。
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绘制用户位置,所以我不认为停止更新功能会是答案,因为我希望即使用户缩放/平移也能继续这样做。
综上所述;是否可以显示一张最初以用户位置为中心的地图(并随着设备的移动而更新(,但每当用户在地图上平移/缩放时,didUpdateLocations一触发,视图就不应自动返回到用户位置?用户应该能够通过按下自定义按钮来触发返回到初始状态。
我正在用Xcode和Swift 4开发我的应用程序。
在珀斯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)")
}
}
并在locationManager didUpdateLocation中使用此变量,以在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
,将我的自定义位置按钮设置为返回到以用户位置为中心