iOS原生地图开发的一些心得

最近在开发鲜橙油耗iOS端,APP中需要获取附近的加油站并且在地图上显示大头钉。

如何获取我附近的加油站?

这里用到MapKit里的一个小部件: MKLocalSearch MKLocalSearch 允许开发者得到一个地理区域内附近的兴趣点。有了这个部件我们可以轻松获取到想要的加油站数据,代码如下:

let search = MKLocalSearch(request: request)
search.start { (response, error) in
guard let items = response?.mapItems else { return }
for item in items {
let annotation: MKPointAnnotation = MKPointAnnotation()
annotation.coordinate = item.placemark.coordinate
annotation.title = item.name
annotation.subtitle = item.phoneNumber ?? ""
self.mapView.addAnnotation(annotation)
}
}

在这段代码中,我获取到了附近的加油站数据,并且在mapView中显示出了大头钉。

如何自定义大头钉图片?

在MapViewController里继承MKMapViewDelegate,并且为mapView设置代理:

class MapViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,CLLocationManagerDelegate,MKMapViewDelegate {
    @IBOutlet weak var mapView: MKMapView! {
        didSet {
            mapView.delegate = self
        }
    }
}

然后实现 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? 这个代理方法:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let identifier = "item"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
    if (annotationView == nil) {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)
    }
    annotationView?.annotation = annotation
    if (annotation is MKUserLocation) {
//这里如果是用户当前位置,设置不同的图片。 annotationView?.image = UIImage(named: "mylocation") } else { annotationView?.image = UIImage(named: "gasstation") } annotationView?.centerOffset = CGPoint(x: 0, y: 0) annotationView?.canShowCallout = true annotationView?.calloutOffset = CGPoint(x: 10, y: 0) annotationView?.isDraggable = true return annotationView }

最终效果如下:

iOS获取附近加油站