适用于iOS的Google地图中的自定义用户位置点(GMSMapview)

时间:2015-06-23 09:04:11

标签: ios objective-c google-maps google-maps-sdk-ios gmsmapview

  1. 是否有官方方法在Google地图for iOS(GMSMapView)中设置自定义用户位置点?
  2. 是否有一种已知的方式来攻击" hack"它?就像遍历所有子视图和图层并捕捉蓝点一样?
  3. 即使您无法自定义其外观,您是否可以控制其z顺序索引?当你有许多标记时,小蓝点会变得隐藏,有时你希望它始终可见。
  4. 由于

3 个答案:

答案 0 :(得分:5)

您可以尝试在以下位置找到图片:

GoogleMaps.framework>资源> GoogleMaps.bundle 要么 GoogleMaps.framework>资源> GoogleMaps.bundle> GMSCoreResources.bundle

我快速搜索了这些,我发现蓝点的唯一关联文件是GMSSprites-0-1x。

请阅读Google地图条款和条件,因为这可能不合法。

答案 1 :(得分:5)

您可以将地图length设置为myLocationEnabled。这将隐藏默认位置点。然后使用NO的实例为您提供职位。在CLLocationManager CLLocationManager方法内,您可以设置自定义didUpdateLocations。使用GMSMarker将其图标属性设置为您希望点看起来的样子。这样可以达到预期的效果。

答案 2 :(得分:2)

Swift 4

停用默认的Google地图当前位置标记(默认情况下已禁用):

mapView.isMyLocationEnabled = false

创建一个标记作为视图控制器的实例属性(因为委托需要访问它):

let currentLocationMarker = GMSMarker()

GMSMarker初始值设定项允许UIImageUIView作为自定义图形,而不是UIImageView。如果您想要更多地控制图形,请使用UIView。在loadViewviewDidLoad(无论您在何处配置地图)中,配置标记并将其添加到地图中:

// configure custom view
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)

// add custom view to marker
currentLocationMarker.iconView = currentLocationMarkerView

// add marker to map
currentLocationMarker.map = mapView

剩下的就是给标记一个坐标(最初和每次用户位置发生变化时),通过CLLocationManagerDelegate代表进行。

extension MapViewController: CLLocationManagerDelegate {

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

        let lastLocation = locations.last!

        // update current location marker 
        currentLocationMarker.position = CLLocationCoordinate2D(latitude: lastLocation.coordinate.latitude, longitude: lastLocation.coordinate.longitude)   

    }

}

位置管理器生成的前几个位置可能不是很准确(尽管有时会这样),所以期望您的自定义标记首先跳转一下。您可以等到位置管理员收集几个坐标,然后将其应用到您的自定义标记,等到locations.count > someNumber,但我发现这种方法非常有吸引力。