[第1章]地图:iOS简易导航
来源:互联网 发布:淘宝上的康之家 编辑:程序博客网 时间:2024/05/20 07:58
一、类介绍
MKDirections
官方文档:
解析:
1、从Apple服务得到导航服务,执行导航需要一个请求类——MKDirectionRequest(下面介绍);
2、每个实例只处理一次导航请求,如果处理多个请求,要创建多个实例;
3、不要在短时间内,请求过多次,否则触发MKErrorLoadingThrottled。
// request must not be nil.init(request request: MKDirectionsRequest)// 计算导航路线,在闭包handler里处理。func calculateDirectionsWithCompletionHandler(_ completionHandler: MKDirectionsHandler)// 闭包,response包含在Apple服务中,得到的route。typealias MKDirectionsHandler = (MKDirectionsResponse?, NSError?) -> Void
MKDirectionRequest
注意:设置起点终点的时候,source的类型是MKMapItem。
转化示意:CLPlacemark -> MKPlacemark -> MKMapItem
实现:MKMapItem( placemark: MKPlacemark( placemark: CLPlacemark类型 ) )
// 导航的起点。func setSource(source: MKMapItem!)// 导航的终点。func setDestination(destination: MKMapItem!)// 导航方式MKDirectionsTransportType。var transportType: MKDirectionsTransportType // Default is MKDirectionsTransportTypeAny
struct MKDirectionsTransportType : RawOptionSetType { // 驾驶。 static var Automobile: MKDirectionsTransportType { get } // 步行。 static var Walking: MKDirectionsTransportType { get } // 所有。 static var Any: MKDirectionsTransportType { get }}
MKMapItem
这个类可以直接跳转到苹果自动的地图,完成导航功能。(好吧…)
这里只是做这样的转换:CLPlacemark -> MKPlacemark -> MKMapItem
二、界面
这简单的界面就不用说了。
三、导航
1、前言
导包、代理那些简单的就不说了,前面的文章也提到。
2、小代码
import UIKitimport MapKitclass ViewController: UIViewController, MKMapViewDelegate{ // 地图 @IBOutlet weak var mapView: MKMapView! // 起点输入框 @IBOutlet weak var srcString: UITextField! // 终点输入框 @IBOutlet weak var dstString: UITextField! // 开始导航按钮方法 @IBAction func navigatingButtonClick(sender: UIButton) // 在geocode中,保留起点和终点各自的CLPlacemark。 var srcPlacemark: CLPlacemark! var dstPlacemark: CLPlacemark!//------------------------------------------------------------------------------ override func viewDidLoad() { super.viewDidLoad() self.mapView.delegate = self }//------------------------------------------------------------------------------ // 点击事件。 @IBAction func navigatingButtonClick(sender: UIButton) { // 注销第一响应。 self.srcString.resignFirstResponder() self.dstString.resignFirstResponder() // 空输入处理。 if srcString.text.isEmpty || dstString.text.isEmpty { UIAlertView(title: "Info empty", message: "Please enter completely", delegate: nil, cancelButtonTitle: "Ok").show() return } // 移除原来的覆盖层。 self.mapView.removeAnnotations(self.mapView.annotations) self.mapView.removeOverlays(self.mapView.overlays) // 开始设置导航。 self.addAnnotations(self.srcString.text) }//------------------------------------------------------------------------------ // 添加大头针:根据参数address(将会传入“开始”或“终点”输入框内的文本),geocode得到相对应的CLPlacemarks. func addAnnotations(address: String) { // 解析字符串,得到相对应的信息。(参考本博客相关文章) var geocoder = CLGeocoder() geocoder.geocodeAddressString(address, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in if error != nil && placemarks == nil{ println(error) return }else { // 取第一个位置。 let firstPlacemark = placemarks.first as! CLPlacemark // 添加大头针在位置上。 var pin = MKPointAnnotation() pin.coordinate = firstPlacemark.location.coordinate // 判断起点或终点。 if address == self.srcString.text { // 保留CLPlacemark self.srcPlacemark = firstPlacemark // 设置大头针信息,并添加到地图。 pin.title = "起点" pin.subtitle = self.srcPlacemark.name self.mapView.addAnnotation(pin) // 因为是异步,在此调用本方法,传入终点的字符串。 self.addAnnotations(self.dstString.text) }else { // 同上。 self.dstPlacemark = firstPlacemark pin.title = "终点" pin.subtitle = self.dstPlacemark.name、 self.mapView.addAnnotation(pin) // 因为是异步,在此调用画导航线路的方法。 self.drawRoute() } } }) }//------------------------------------------------------------------------------ // 画导航线路。 func drawRoute() { // 创建一个请求。 var request = MKDirectionsRequest() // 设置请求的起点和终点(MKMapItem类型,用getMapItemByCLPlacemark转换)。 request.setSource(self.getMapItemByCLPlacemark(self.srcPlacemark)) request.setDestination(self.getMapItemByCLPlacemark(self.dstPlacemark)) // 根据request,创建一个导航类实例。 var direction = MKDirections(request: request) // 计算路线。 direction.calculateDirectionsWithCompletionHandler { (response: MKDirectionsResponse!, error: NSError!) -> Void in if error != nil && response == nil { println(error) return }else { // 默认只返回一条route。 var route = response.routes.first as! MKRoute // 添加到地图上。 self.mapView.addOverlay(route.polyline) } } }//------------------------------------------------------------------------------ // 本文中,“类介绍”有提及。 func getMapItemByCLPlacemark(mark: CLPlacemark) -> MKMapItem { return MKMapItem(placemark: MKPlacemark(placemark: mark)) }//------------------------------------------------------------------------------ // 用Renderer在地图上显示覆盖层。(参考本博客相关文章) func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { var polylineRenderer = MKPolylineRenderer(overlay: overlay as! MKPolyline) polylineRenderer.strokeColor = UIColor.redColor() polylineRenderer.lineWidth = 5.0 return polylineRenderer }}
结果
0 0
- [第1章]地图:iOS简易导航
- [第1章]地图:iOS模拟器的使用
- iOS 调用地图导航
- iOS 地图导航
- iOS 调用地图导航
- iOS 调用地图导航
- iOS 调用地图导航
- ios 地图导航
- iOS地图系统导航
- iOS调用地图导航
- iOS 调用地图导航
- iOS百度地图导航
- IOS 跳转导航地图
- (ZT)iOS 调用地图导航
- iOS自带地图导航
- IOS开发之地图导航
- IOS 高德地图导航
- 地图导航ios(url)
- 制作View覆盖层(大小,位置相同)CoverView
- 持久化persistence.xml配置文件
- 部分正则
- C语言编程入门——浮点数
- 在Hudson中,使用ant自动对安卓项目编译打包apk
- [第1章]地图:iOS简易导航
- flash链接“手形”闪烁的解决方法
- 【effective c++读书笔记】【第2章】构造/析构/赋值运算(2)
- c和c++交互编译
- Oracle SQL性能优化
- 图的深度遍历 SDUT 2107
- ViewDragHelper详解
- POJ 1519:Digital Roots
- ireport 中的$F、$P、$V