# 导航

作者: XMaster_Young | 来源:发表于2016-05-05 10:00 被阅读0次

方案一:使用的是系统APP的导航(高德地图)

  1. 根据用户输入的两个地点进行导航(或者是一个目的地,再获取用户的位置)
  • 所用到的技术点
    • 地理编码/反地理编码
    • 系统的MKMapItem类
  • 反向逆推发进行设计实现(缺什么补什么)
// MARK:- 懒加载
    private lazy var geoc : CLGeocoder = {
       return CLGeocoder()
    }()

    // 在touchesBegan中进行测试
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        // 根据用户的输入的地点进行地理编码
        geoc.geocodeAddressString("广州") { (clpls : [CLPlacemark]?, error :  NSError?) -> Void in
            if error == nil {
                // 判断地标对象数组是否有值
                guard let clpls = clpls else {return}
                // 取出相关度最好的地标对象
                guard let gzCLPL = clpls.first else {return}

                self.geoc.geocodeAddressString("上海") { (clpls : [CLPlacemark]?, error :  NSError?) -> Void in
                    if error == nil {
                        guard let clpls = clpls else {return}
                        guard let shCLPL = clpls.first else {return}

                        self.beginNavigation(gzCLPL, endCLPL: shCLPL)
                    }
                }
            }
        }
    }

    // 参数两个地标对象
    func beginNavigation(startCLPL : CLPlacemark, endCLPL : CLPlacemark) {
        // 设置起点
        // 转换为MKPlacemark的类型的地表对象
        let startMKPL = MKPlacemark(placemark: startCLPL)
        // 转化MKMapItem
        let startItem = MKMapItem(placemark: startMKPL)

        // 设置终点
        let endMKPL = MKPlacemark(placemark: endCLPL)
        let endItem = MKMapItem(placemark: endMKPL)

        // 设置起点和终点(mapItems: [MKMapItem])
        let mapItems : [MKMapItem]  = [startItem, endItem]

        // 设置启动项(launchOptions: )
        let dict : [String : AnyObject] = [
            // (键 : 值)的形式
            // 方向模式 : 开车
            MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
            // 地图类型 :普通(Standard)
            MKLaunchOptionsMapTypeKey : MKMapType.Standard.rawValue,
            // 交通 :true表示显示
            MKLaunchOptionsShowsTrafficKey : true
        ]

        // 通过设置的内容,打开系统的导航app进行导航
        MKMapItem.openMapsWithItems(mapItems, launchOptions: dict)
        MKMapItem.openMapsWithItems(<#T##mapItems: [MKMapItem]##[MKMapItem]#>, launchOptions: <#T##[String : AnyObject]?#>)

    }

方案二:发送网络请求给苹果服务器获取导航路线(MKDirections)

其中也是要根据出发地和目的地来发送xing请求路线的,并根据出发地和目的地进行地理编码/反地理编码来得到最好的相关度的地标对象(CLPlacemark),然后将对应的地标对象转化为MKPlacemark类型的地标对象

// CLPlacemark类型的出发地和目的地的地标对象
    func getRouteMessage(sourceCLPL : CLPlacemark, destinationCLPL : CLPlacemark ) {
        // 创建路线请求对象
        let request  = MKDirectionsRequest()

        // 设置起点
        let sourceMKPL = MKPlacemark(placemark: sourceCLPL)
        request.source = MKMapItem(placemark: sourceMKPL)

        // 设置终点
        let destinationMKPL = MKPlacemark(placemark: destinationCLPL)
        request.destination = MKMapItem(placemark: destinationMKPL)


        // 创建路线对象
        let directions = MKDirections(request: request)

        // 请求路线信息
        directions.calculateDirectionsWithCompletionHandler { (response : MKDirectionsResponse?, error : NSError?) -> Void in
            if error == nil {

                // MKDirectionsResponse 响应对象
                // routes: [MKRoute] 所有的路线

                // MKRoute
                // name 路线名称
                // advisoryNotices 警告信息
                // distance 整条路线的总距离
                // expectedTravelTime 预期到达时间
                // transportType 交通方式
                // polyline : 折线数据模型,展示在地图上几何图形(覆盖层)
                // steps: [MKRouteStep] :每个步骤应该怎么走

                // [MKRouteStep]
                // instructions : 每一步的描述  "前方500 左转"
                // notice : 每个路线的警告
                // polyline : 单个折线的数据模型
                // distance : 每一步骤的距离
                // transportType : 每一步骤的交通方式

                guard let response = response else {return}

                let routes : [MKRoute] = response.routes

                for route in routes {

                    print(route.name,route.distance)

                    let steps = route.steps

                    for step in steps {
                        print(step.instructions)
                    }

                }

            }
        }

  • 渲染层描绘行走路线
/**
     当向地图上添加覆盖层的时候就会调用这个代理方法,找到对应的渲染图层并返回
     // 每一个覆盖层的渲染图层都是不一样的
     - parameter mapView: 地图
     - parameter overlay: 覆盖层

     - returns: 渲染图层
     */
    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {

        // 1.创建折线的渲染图层
        let polylineRender = MKPolylineRenderer(overlay: overlay)

        // 2.设置线宽以及颜色
        polylineRender.lineWidth = 6
        polylineRender.strokeColor = UIColor.redColor()

        // 3.返回对应的渲染图层
        return polylineRender

    }

相关文章

  • 前段常用单词

    一、导航类 导航:nav 主导航:mainbav 子导航:subnav 顶导航:topnav 边导航:sideba...

  • 移动导航类型

    tab 导航 抽屉导航 list导航 九宫格导航 复合导航

  • APP导航设计模式

    导航主要分为两大类,横向和纵向。横向的导航有:标签导航、舵式导航、tab导航、轮播导航;纵向的导航有:宫格导航、下...

  • 标签式导航的设计思路

    导航分很多类别,如标签导航、抽屉式导航、九宫格导航、混合组合导航、列表式导航、Tab导航、平铺导航等等。之前在我的...

  • Bootstrap-导航菜单-2018.07.07

    Bootstrap-导航菜单 nav 标签式导航 胶囊式导航 垂直胶囊式导航 两端对齐导航 导航元素下拉菜单

  • iOS应用导航模式

    IOS导航模式: 标签导航模式、桌面式模式、抽屉式导航、列表式导航、 点聚式导航、下拉菜单式导航、轮播导航 接下来...

  • Tailwind Navbar

    导航栏 PC导航栏仿Airbnb导航条 PC导航条添加图标 PC导航条上图下字 移动端导航条

  • 程序员导航

    转载自:程序员不可不知的导航 导航网址 极客导航 导航湾 nice导航 GitFox 程序员工具箱 沃克导航 去瞧瞧导航

  • 李亚涛:网址导航网站提交

    大家对网址导航应该不陌生,比如HAO123网址导航,114网址导航,2345导航,360导航,搜狗网址导航等等 网...

  • 交互设计学习_2_移动产品模式设计之导航

    在信息架构设计环节中需要设计产品的页面导航,常见的一级导航有标签导航、分段式导航、抽屉导航、舵式导航;二级导航有列...

网友评论

      本文标题:# 导航

      本文链接:https://www.haomeiwen.com/subject/njrdrttx.html