码迷,mamicode.com
首页 > 移动开发 > 详细

ios原生地图开发篇

时间:2015-08-21 13:37:31      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:ios   地图开发   原生地图   

开发环境:Xcode6.4

模拟器  : IOS8.4

OS X : 10.0.4

小编博客链接: http://www.goofyy.com

首先例子是小编写的一个定位获取经纬度,然后在地图上面显示,并自定义大头针的一个程序。先上图

技术分享

首先说一下定位,在 iOS 8 之前,位置服务的权限是二元的:你要么赋予一个应用得到使用位置服务的权限,要么不给。你可以在 Settings.app 查看哪些 app 可以在后台取得你的位置信息,但除了完全不让这个 app 使用位置服务之外,你不能做任何的事来阻止它获取位置信息,但是在IOS8之后, 修改了这个问题,ISO8把应用程序分成两个权限,

“使用期间”  正如标题,程序在使用期间会获取你的位置信息。
“始终”   这个就跟IOS8之前一样,会在程序中一直获取你的个人信息。


所以我们在使用地图的时候,要在Info.plist里面添加两行文字,设置我们程序使用地图的权限。

技术分享

NSLocationWhenInUseUsageDescription  //用的时候获取位置

NSLocationAlwaysUsageDescription    //始终获取用户位置

后面的value 可填写或不填写。value是在获取用户定位允许的弹窗信息。如果没有这两行东东,那么程序不会提醒用户获取定位允许,那么你的程序也一直没办法获取定位。明白了之后,就开始写程序吧。


首先就是先把CoreLocation框架引入过来。直接晒代码吧。懒得写了。代码下面注释

//
//  ViewController.swift
//  获取路线
//
//  Created by goofygao on 8/18/15.
//  Copyright (c) 2015 goofyy. All rights reserved.
//

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController,MKMapViewDelegate,CLLocationManagerDelegate {
    @IBOutlet weak var mapView: MKMapView!
    var locationManger:CLLocationManager = CLLocationManager()
    var location:CLLocation!
    var ann:MKPointAnnotation = MKPointAnnotation()
    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManger.delegate = self
        locationManger.desiredAccuracy = kCLLocationAccuracyBest
        locationManger.distanceFilter = kCLLocationAccuracyKilometer
        
        locationManger.requestAlwaysAuthorization()
        locationManger.startUpdatingLocation()
        
        mapView.delegate = self
        mapView.mapType = MKMapType.Satellite
        
        ann.title = "定位的位置"
        ann.subtitle = "广州"
        
        mapView.addAnnotation(ann)
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /**
    
    重写 - 更改大头针颜色
    :param: mapView
    :param: annotation
    
    :returns: MKAnnotationView
    */
    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
    {
        var view:MKPinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        view.pinColor = MKPinAnnotationColor.Red
        //view.image = UIImage(named: "localtion.png")
        var viewLeft = UIView(frame: CGRectMake(0, 0, 50, 50))
        viewLeft.backgroundColor = UIColor.redColor()
        var viewRight = UIView(frame: CGRectMake(0, 0, 50, 50))
        viewRight.backgroundColor = UIColor.greenColor()
        view.leftCalloutAccessoryView = viewLeft
        view.rightCalloutAccessoryView = viewRight
        view.draggable = true
        view.canShowCallout = true
        return view
    }
    
   
    
    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        location = locations.last as! CLLocation
        if((location) == nil) {
            locationManger.startUpdatingLocation()
        }
        println("\(location.coordinate.longitude)")
        mapView.region = MKCoordinateRegion(center: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), span: MKCoordinateSpanMake(20, 20))
        ann.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
    }

}

分开来说,首先是定位的问题。添加CLLocationManagerDelegate代理,实现代理的方法

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { }


这个方法是在获取到手机的位置的时候调用。


        locationManger.delegate = self
        locationManger.desiredAccuracy = kCLLocationAccuracyBest
        locationManger.distanceFilter = kCLLocationAccuracyKilometer
        
        locationManger.requestAlwaysAuthorization()
        locationManger.startUpdatingLocation()

设置代理为当前,设置定位的精度和开始定位。


然后到了设置地图地方了。添加地图的代理,设置大头针的主标题和副标题。

mapView.delegate = self
        mapView.mapType = MKMapType.Satellite
        
        ann.title = "定位的位置"
        ann.subtitle = "广州"
        
        mapView.addAnnotation(ann)


大头针的默认显示颜色为红色。然后我们可以重写一下大头针的方法,来重绘一下大头针


func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
    {
        var view:MKPinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
        view.pinColor = MKPinAnnotationColor.Red
        //view.image = UIImage(named: "localtion.png")
        var viewLeft = UIView(frame: CGRectMake(0, 0, 50, 50))
        viewLeft.backgroundColor = UIColor.redColor()
        var viewRight = UIView(frame: CGRectMake(0, 0, 50, 50))
        viewRight.backgroundColor = UIColor.greenColor()
        view.leftCalloutAccessoryView = viewLeft
        view.rightCalloutAccessoryView = viewRight
        view.draggable = true
        view.canShowCallout = true
        return view
    }


设置大头针和地图定位的经纬度,因为经纬度是在CLLocationManagerDelegate协议的实现方法中获取到,所以我们在它的协议方法里使用。


location = locations.last as! CLLocation
        if((location) == nil) {
            locationManger.startUpdatingLocation()
        }
        println("\(location.coordinate.longitude)")
        mapView.region = MKCoordinateRegion(center: CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), span: MKCoordinateSpanMake(20, 20))
        ann.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
    }

设置了大头针的经纬度和定位的经纬度,和地图显示的范围。

然后看下一个。

地图覆盖层

技术分享

简单来说就是在地图地图上面画图。

首先是在地图上面画线

        var coor = [CLLocationCoordinate2D]()
        for (var i=0; i<5; i++) {
         po = CLLocationCoordinate2DMake(CLLocationDegrees(23 + i), 113)
            coor.append(po)
        }
        var line = MKPolyline(coordinates: &coor, count: 5)
        mapView.addOverlay(line)


这里有一个犯错点,var line =MKPolyline(coordinates: &coor, count:5)  。

 MKPolyline(coordinates: <#UnsafeMutablePointer<CLLocationCoordinate2D>#>, count: <#Int#>)


不少人并不知道<#UnsafeMutablePointer<CLLocationCoordinate2D>#>这货是什么卵类型。说白了就是一个指针。从oc过来的大部分人都应该知道,因为oc在存储上面for循环生成的几个经纬度的时候,通常采用的是申请一部分内存,然后放进去。采用了C的语法。so下面直接引用了指针。指向存储经纬度空间的内存。这里也就是这个数组的地址。加个“&”即可。


然后添加 MKMapViewDelegate 代理,实现代理的方法。

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
        var render = MKPolylineRenderer(overlay: overlay)
        render.lineWidth = 3
        render.strokeColor = UIColor.redColor()
        return render
        
    }


这里会自动调用代理的方法。搞到这里的时候,运行,一条直线也就出来了。下面是两个项目的工程,放在了github上


完整项目 https://github.com/goooooooofy/originMapApple.git




版权声明:本文为博主原创文章,未经博主允许不得转载。

ios原生地图开发篇

标签:ios   地图开发   原生地图   

原文地址:http://blog.csdn.net/u014406672/article/details/47832695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!