框架
MapKit
iOS中的MapKit框架提供地图的显示,导航,地点标注,增加图层等。
利用MapKit可以集成一个全功能地图到app中,无需任何编码。
这次将讲述四个重点:
-
1.1如何嵌入地图
-
1.2用Geocoder把地址转换为坐标
-
1.3在地图上加图钉?(标注)
-
1.4定制地图标注
-
1.1如何嵌入地图
1.1.1开启MapKit框架
默认Xcode工程中是没有绑定MapKit框架,需要手工打开。
点选工程,选中Target,然后在Capabilities中打开Maps即可。
1.1.2MapView
MapView提供各式选项,可以实现缩放,滑动定制化。可以在其属性中将地图从标准切换到卫星或混合显示模式。
还可以启用"用户位置"功能。
-
1.2用Geocoder把地址转换为坐标
1.2.1如何定位地点
仅实际地址还不足以定位,必须是含经纬度的地理坐标。
MapKit中的Geocoder类用于这种转换,即地址转换为坐标(正转);坐标转回为地址(反转)。
数据保存在"地标(Placemark)"对象中。
1.2.2使用方式
MapView提供各式选项,可以实现缩放,滑动定制化。可以在其属性中将地图从标准切换到卫星或混合显示模式。
实例化一个CLGeocoder,调用geocodeAddressString方法即可。
实际地址没有固定的格式,此方法会向坐标转换服务器查询并解析,然后返回一个地标对象数组。
地址越准确,返回的地标越接近。如果地址不太准确,可能返回多个地标。
通过解析完毕返回的地标对象(CLPlacemark类),可轻易获得地址的坐标。
-
1.3在地图上加图钉?(标注)
1.3.1标注annotation
通常见的标注是一个弹出提示框,可以包含一张图片。
开发角度,标注包含2个不同的对象:
- 一个标注对象:保存有地标的数据比如名称;遵从MKAnnotation协议。
- 一个标注视图:用于展现地标,图钉就是一个例子。如果你想用铅笔代替图钉?,需要自定义视图。
MapKit默认提供标注的对象和视图,无需自己创建。
1.3.2添加地图控制器
step1:
New File > Cocoa Touch Class,
父类UIViewController,命名(MapViewController)
然后指定地图视图的控制器为这个文件
step2:
在源码的开头,加上import MapKit
Ctrl拖动视图上的Map View到源码,建立关联:
@IBOutlet weak var mapView:MKMapView!(命名)
step3:
在viewDidLoad中添加:
//将地址转换为坐标,如果转换错误即日志输出error let geocoder = CLGeocoder() geocoder.geocodeAddressString(地址:String) { (placemarks, error) -> Void in if error != nil{ print(error) return } //如果转换成功,那么将得出的坐标数组取第一个(placemarks[0])命名为placemark if let placemarks = placemarks{ let placemark = placemarks[0] //annotation标注 let annotation = MKPointAnnotation() annotation.title = ""(String) annotation.subtitle = ""(String) //把取出来坐标的地址赋予标注,然后在mapView中显示出来 if let location = placemark.location{ annotation.coordinate = location.coordinate self.mapView.showAnnotations([annotation], animated: true) self.mapView.selectAnnotation(annotation, animated: true) } } }
大意解释:如果地址可以转换,那么取回地标数组中第一个(最接近的一个),标注在地图上。
-
1.4定制地图标注
1.4.1添加标注图片
前面提过的,我们可定制标注视图。
需要遵从MKMapViewDelegate协议,这个协议可以地图更新相关的信息。
其中一个方法可以定制标注视图:
optional public func mapView(mapView:MKMapView,viewForAnnotation annotation:MKAnnotation)->MKAnnotation View?
step1:
为了遵从协议,需要在地图控制器啊源码的类声明中加上MKMapViewDelegate:
class MapViewController:UIViewController,MKMapViewDelegate{
}
step2:
在视图大纲中,Ctrl拖动MapView到地图控制器,选中delegate。
这样地图控制器就成为MapView的代理,负责实现指定的方法。
1.4.2标注视图方法实现
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { let id = "我的图钉" //用户位置视图也是一个标注视图,排除对其的定制 if annotation is MKUserLocation{ return nil } //为性能考虑,重用一个已存在的标注视图 var annotationView = self.mapView.dequeueReusableAnnotationViewWithIdentifier(id) as? MKPinAnnotationView //如果没有可重用的就初始化一个标注视图,并启用气球提示 if annotationView == nil{ annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: id) annotationView?.canShowCallout = true } //添加一个缩略图到标注视图中(restaurant.image是我个人运用的视图) let leftIconView = UIImageView(frame: CGRectMake(0, 0, 53, 53)) leftIconView.image = UIImage(named: restaurant.image!) annotationView?.leftCalloutAccessoryView = leftIconView return annotationView }
1.4.3地图其它功能
MKMapView类有很多功能可以控制,比如:
showsTraffice - 显示交通信息
showsScale - 显示比例尺(左上角)
showsCompass - 显示指南针按钮(右上角)
viewDidload中加入
mapView.showsCompass = true
mapView.showsScale = true
mapView.showsTraffice = true
等等
ps:如果要运用更深入的功能比如驾车,公交,骑行路线等信息,需要研究MKDirection类。