地图功能的实现

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

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

Map view delegate 回调

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

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

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

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

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

代码也是很简单

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

然后实现回调函数

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

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

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

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

    1. P0 (80H) P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 2.SP 栈指针(81H) 3.DPTR 数据指针(由DPH和DPL组成) DPL 数据指针低八 ...

  2. VS调试在Win7(vista系列)操作系统下 HttpListener拒绝访问解决办法

    一. VS调试在Win7(vista系列)操作系统下 HttpListener无法绑定多个 指定IP.端口问题 来自:http://www.cnblogs.com/ryhan/p/4195693.ht ...

  3. springMVC配置(XML配置详解)

    原文出自:http://www.newasp.net/tech/71609.html web.xml配置: servlet> <servlet-name>dispatcher< ...

  4. setAttribute()和getAttibute(),getParameter()

    request.setAttribute("key",value)方法给主键设置一个值, request.getAttribute("key")方法从上述设置的 ...

  5. 剑指offer题目31-40

    面试题31:连续字数组的最大和 public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int len ...

  6. C#键盘钩子 鼠标钩子

    最新对C#模拟键盘按键,鼠标操作产生了兴趣.特从网上收集了一些常用的API用来调用键盘,鼠标操作. class Win32API { #region DLL导入 /// <summary> ...

  7. POJ 2175 Evacuation Plan 费用流 负圈定理

    题目给了一个满足最大流的残量网络,判断是否费用最小. 如果残量网络中存在费用负圈,那么不是最优,在这个圈上增广,增广1的流量就行了. 1.SPFA中某个点入队超过n次,说明存在负环,但是这个点不一定在 ...

  8. php中or的含义

    or其实是Php中的短路或 经常看到这样的语句: $file = fopen($filename, r) or die("抱歉,无法打开: $filename"); or在这里是这 ...

  9. jquery实现tab页切换显示div

    1.jQuery实现tab切换显示代码实现 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &q ...

  10. java堆内存与栈内存

    java的内存分为两种,堆内存与栈内存: 堆内存用来存放数组和new的对象,比如一个文件,字节流是存放在堆中,栈内存为这个文件开辟一个索引,也就是这个文件的地址,并且保存在栈中.对象由GC处理释放内存 ...