我正在使用适用于 iOS 的 2013 版 Google Maps SDK。我想用另一个图标或周围的脉动圆圈为当前位置自定义默认蓝点。
我知道我们可以mapView:viewForAnnotation:
在 MKMapView 中做到这一点,但我不知道如何使用谷歌地图做到这一点。
我正在使用适用于 iOS 的 2013 版 Google Maps SDK。我想用另一个图标或周围的脉动圆圈为当前位置自定义默认蓝点。
我知道我们可以mapView:viewForAnnotation:
在 MKMapView 中做到这一点,但我不知道如何使用谷歌地图做到这一点。
当前版本的 SDK (1.4.3) 无法做到这一点,实际上这个请求存在一个未解决的问题:看这里。
作为一种解决方法,您可以使用以下命令隐藏默认按钮:
_map.myLocationEnabled = NO;
然后创建一个自定义GMSMarker
GMSMarker *pointMarker = [GMSMarker markerWithPosition:currentPosition];
pointMarker.icon = [UIImage imageNamed:@"YourImage"];
pointMarker.map = _map;
并使用 a 更改它的位置CLLocationManager
,因此它始终显示当前位置。这有点棘手,但我认为这是实现这一目标的唯一方法。如果您需要更完整的示例,请告诉我。
对于 Swift 4.0
设置 GMSMapView 时:
mapView.isMyLocationEnabled = false
当用户位置更新时:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocationMarker = GMSMarker(position: location.coordinate)
userLocationMarker.icon = UIImage(named: "yourImageName")
userLocationMarker.map = mapView
}
斯威夫特 4
class MasterMapViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {
let currentLocationMarker = GMSMarker()
override func viewDidLoad() {
super.viewDidLoad()
addCurrentLocationMarker()
}
func addCurrentLocationMarker() {
let currentLocationMarkerView = UIView()
currentLocationMarkerView.frame.size = CGSize(width: 40, height: 40)
currentLocationMarkerView.layer.cornerRadius = 40 / 4
currentLocationMarkerView.clipsToBounds = true
let currentLocationMarkerImageView = UIImageView(frame: currentLocationMarkerView.bounds)
currentLocationMarkerImageView.contentMode = .scaleAspectFill
currentLocationMarkerImageView.image = UIImage(named: "masterAvatar")
currentLocationMarkerView.addSubview(currentLocationMarkerImageView)
currentLocationMarker.iconView = currentLocationMarkerView
currentLocationMarker.isTappable = false
currentLocationMarker.map = mapView
}
// location manager delegate
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
currentLocationMarker.position = lastLocation.coordinate
}
}
仅将此作为起点!这不是一个有吸引力的替代方案,因为不断更新标记在地图上的位置会影响性能。如果您要走这条路线,请找到一种方法,不要不断地从位置管理器代表处更新标记的位置。