地图功能的实现

因为有个项目要在地图中显示位置,所以用到了MapKit。

记录下来,以免以后忘记。

加入MapKit library

首先得在项目中加入MapKit,如图

MapView

先增加一个ViewController,我这里用的storyboard,这个玩意还是挺好用的,比以前用xib好多了。

然后拖一个mapview上去,如:

给新增加的ViewController绑定一个class。首先得增加一个class,从uiViewController继承下来。这个很简单,如图

把新增加的ViewController绑定到这个class,也很easy,发现Xcode还是挺牛的。就是在右边Identity inspector里面的custom class里面改成新增加的类,原来是UIViewController。

然后给map view控件绑定一个变量,类型是MKMapView

然后就初始化mapview,显示。代码如下:

 1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4 // Do any additional setup after loading the view.
5
6 _mapView.mapType = MKMapTypeStandard;//标准模式
7 _mapView.showsUserLocation = YES;//显示自己
8
9 _mapView.zoomEnabled = YES;//支持缩放
10
11
12 CLLocationCoordinate2D pos = {39.931203, 116.395573};//找个坐标,我是用百度坐标抓取弄的。http://api.map.baidu.com/lbsapi/getpoint/
13
14 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(pos,2000, 2000);//以pos为中心,显示2000米
15 MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];//适配map view的尺寸
16 [_mapView setRegion:adjustedRegion animated:YES];
17
18
19 }

我这里使用百度坐标,找了个坐标(直接搜索“百度 坐标”),然后在我们自己的地图里显示。这样运行一下就可以看到:

Map view delegate 回调

可以实现协议MKMapViewDelegate, 这样就会有几个回调。

 1 - (void) mapViewWillStartLoadingMap:(MKMapView *)mapView//开始从服务器获取地图数据
2 {
3
4 }
5
6 -(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView//获取数据结束
7 {
8
9 }
10
11 - (void) mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error//获取数据失败了。
12 {
13
14 }

获取设备当前位置并且在地图中显示

增加一个按钮,点击这个按钮,将显示设备当前位置。点击上面的按钮将显示某个固定位置。

CLLocationManager,首先使用CLLocationManager来获取设备的当前位置。

代码也是很简单

 1 //获得自己的当前的位置信息
2 - (void) getCurPosition
3 {
4 //开始探测自己的位置
5 if (locationManager==nil)
6 {
7 locationManager =[[CLLocationManager alloc] init];
8 }
9
10
11 if ([CLLocationManager locationServicesEnabled])
12 {
13 locationManager.delegate=self;
14 locationManager.desiredAccuracy=kCLLocationAccuracyBest;
15 locationManager.distanceFilter=10.0f;
16 [locationManager startUpdatingLocation];
17 }
18 }

然后实现回调函数

 1 #pragma mark -- CLLocationManagerDelegate
2 - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
3 {
4 if ([locations count] > 0) {
5 CLLocation* loc = [locations objectAtIndex:0];
6 CLLocationCoordinate2D pos = [loc coordinate];
7
8 NSLog(@"locationManager, longitude: %f, latitude: %f", pos.longitude, pos.latitude);
9
10 if (show == NO) {
11 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(pos,2000, 2000);//以pos为中心,显示2000米
12 MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];//适配map view的尺寸
13 [_mapView setRegion:adjustedRegion animated:YES];
14
15 show = YES;
16 }
17 }
18 }

当设备位置变化时,这个函数会被调用。这样我们就可以根据位置来做一些事情了。这个例子里就在第一次获取位置的时候更新一下地图显示。以设备当前位置为中心,显示2000米。

完了。贴一下mapview所在的controller代码:

  1 //
2 // KMapViewController.m
3 // MapDemo
4 //
5 // Created by Kevin on 14-2-10.
6 // Copyright (c) 2014年 Kevin. All rights reserved.
7 //
8
9 #import "KMapViewController.h"
10
11 @interface KMapViewController ()
12
13 @end
14
15 @implementation KMapViewController
16
17 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
18 {
19 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
20 if (self) {
21 // Custom initialization
22 }
23 return self;
24 }
25
26 - (void)viewDidLoad
27 {
28 [super viewDidLoad];
29 // Do any additional setup after loading the view.
30
31 show = NO;
32
33 _mapView.mapType = MKMapTypeStandard;//标准模式
34 _mapView.showsUserLocation = YES;//显示自己
35 _mapView.delegate = self;
36 _mapView.zoomEnabled = YES;//支持缩放
37
38
39 NSString* i = self.Index;
40
41 if([i isEqualToString:@"1"])
42 {
43 CLLocationCoordinate2D pos = {39.931203, 116.395573};//找个坐标,我是用百度坐标抓取弄的。http://api.map.baidu.com/lbsapi/getpoint/
44
45 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(pos,2000, 2000);//以pos为中心,显示2000米
46 MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];//适配map view的尺寸
47 [_mapView setRegion:adjustedRegion animated:YES];
48
49 }
50 else
51 {
52 [self getCurPosition];
53 }
54
55 }
56
57 - (void)didReceiveMemoryWarning
58 {
59 [super didReceiveMemoryWarning];
60 // Dispose of any resources that can be recreated.
61 }
62
63 - (void) dealloc
64 {
65
66 // [super dealloc];
67 }
68
69 //获得自己的当前的位置信息
70 - (void) getCurPosition
71 {
72 //开始探测自己的位置
73 if (locationManager==nil)
74 {
75 locationManager =[[CLLocationManager alloc] init];
76 }
77
78
79 if ([CLLocationManager locationServicesEnabled])
80 {
81 locationManager.delegate=self;
82 locationManager.desiredAccuracy=kCLLocationAccuracyBest;
83 locationManager.distanceFilter=10.0f;
84 [locationManager startUpdatingLocation];
85 }
86 }
87
88 #pragma mark -- MPMapViewDelegate
89
90 - (void) mapViewWillStartLoadingMap:(MKMapView *)mapView
91 {
92
93 }
94
95 -(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
96 {
97
98 }
99
100 - (void) mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
101 {
102
103 }
104
105 #pragma mark -- CLLocationManagerDelegate
106 - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
107 {
108 if ([locations count] > 0) {
109 CLLocation* loc = [locations objectAtIndex:0];
110 CLLocationCoordinate2D pos = [loc coordinate];
111
112 NSLog(@"locationManager, longitude: %f, latitude: %f", pos.longitude, pos.latitude);
113
114 if (show == NO) {
115 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(pos,2000, 2000);//以pos为中心,显示2000米
116 MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];//适配map view的尺寸
117 [_mapView setRegion:adjustedRegion animated:YES];
118
119 show = YES;
120 }
121 }
122 }
123
124 @end
 

iOS开发——高级技术&地图功能的实现的更多相关文章

  1. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  2. iOS开发——高级技术精选OC篇&Runtime之字典转模型实战

    Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://w ...

  3. iOS开发——高级技术&广告服务

    广告服务 上 面也提到做iOS开发另一收益来源就是广告,在iOS上有很多广告服务可以集成,使用比较多的就是苹果的iAd.谷歌的Admob,下面简单演示一下如何 使用iAd来集成广告.使用iAd集成广告 ...

  4. iOS开发——高级技术&内购服务

    内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...

  5. iOS开发——高级技术&签名机制

    签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...

  6. iOS开发——高级技术&摇一摇功能的实现

    摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么 ...

  7. iOS开发——高级技术&调用地图功能的实现

    调用地图功能的实现 一:苹果自带地图 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加 轻松愉快和美好.连 ...

  8. iOS开发——高级技术&蓝牙服务

    蓝牙服务 蓝牙 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的 ...

  9. iOS开发——高级技术&PassBook服务

    PassBook服务 Passbook是苹果推出的一个管理登机牌.会员卡.电影票.优惠券等信息的 工具.Passbook就像一个卡包,用于存放你的购物卡.积分卡.电影票.礼品卡等,而这些票据就是一个“ ...

随机推荐

  1. Linux系统编程-防止僵尸进程产生的常用方法

    1.父进程调用wait函数或waitpid函数回收子进程. 2.让init进程去处理子进程回收工作,代码中加上"signal(SIGCHLD, SIG_IGN)"这句话.

  2. Ubuntu 14.04 (32位)上搭建Hadoop 2.5.1单机和伪分布式环境

    引言 一直用的Ubuntu 32位系统(准备下次用Fedora,Ubuntu越来越不适合学习了),今天准备学习一下Hadoop,结果下载Apache官网上发布的最新的封装好的2.5.1版,配置完了根本 ...

  3. Servlet实现重定向的两种方式

    使用Servlet实现请求重定向:两种方式 1. response.setStatus(302); response.setHeader("location", "/Re ...

  4. 为什么for(int i=0;i<9;i++) 在c语言中是错误的?

    显示表示,i 变量不可以在for中定义,必须在外面定义,这是为什么? 因为C99标准以前的C标准是不支持临时变量在for循环中定义的. C99标准就支持这样写.但是目前有些编译器并不怎么愿意支持C99 ...

  5. python学习笔记-Day7

    class Province: # 静态字段(类变量/属性) country = '中国' def __init__(self, name): # 普通字段(实例变量/属性) self.name = ...

  6. 移动端调试工具推荐 小苹果和debugap

    小苹果的安装很简单,这是官网,一看就会,完全小白教程. http://www.xbole.com/ debugap的也很简单,这里简单附图介绍一下 ps 官网: http://www.debuggap ...

  7. python 中 深拷贝和浅拷贝的理解

    在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一 ...

  8. net 连mysql奇怪问题

    程序出现以上提示,采用6.3.5的connetor就好了.

  9. RVM 实用指南

    rvm是一个命令行工具,可以提供一个便捷的多版本ruby环境的管理和切换. https://rvm.io/ 如果你打算学习ruby/rails, rvm是必不可少的工具之一. 这里所有的命令都是再用户 ...

  10. XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.   为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...