MapKit

框架

 

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类。

     

转载于:https://www.cnblogs.com/jerry-q1/articles/6207241.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值