我有一个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开发应用程序。
答案 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