- 浏览: 568028 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
JYY282:
[i][/i]
Ecshop与Shopex的比较 -
qq247890212:
我也遇见这问题了,真诡异。重新下载个猫换了就好了。 太浪费时间 ...
诡异:ClassNotFoundException: org.springframework.web.filter.CharacterEncoding
From:http://www.iblue.cc/2011/05/gps%E4%BD%8D%E7%BD%AE%E5%92%8C%E5%9C%B0%E5%9B%BE%E5%BC%80%E5%8F%91/
有了iPhone,意味着我们不会再迷路了。有了iPhone内建的全球定位系统(Global Positioning System,GPS)硬件,以及一些创新的位置和地图软件,iPhone不仅随时知道你位于何处,而且还能显示给你看。
iPhone使用所谓的辅助GPS技术来搞清楚你位于何处。有了内建的GPS接收器,iPhone可以利用通信塔台和Wi-Fi热点之间的三角信息,来增加它发送给应用程序的位置数据的准确性。
在本章中,我们首先介绍Core Location,这是让我们快速且轻松地找到当前位置的框架。然后,我们将介绍Map Kit框架,它使我们能够把流行的Google Maps引擎所支持的地图添加到自己的应用中。我们还将看看如何轻松地执行反向地理编码来获取一个位置的地址,最后,我们把所有这些概念组合到一个地图应用程序中,它能够再现本地Maps应用程序的很多功能。
Map Kit是基于Google Maps引擎的地图框架,允许我们能够向应用程序中添加交互式的地图。地图可以滚动或缩放到地球上的任何区域,并且可以有标签或注释,以便向地图添加需要额外显示的信息。
向应用程序中添加地图:
1)创建一个新的基于视图的应用程序,将其保存为MappingExample。
2)在Groups & Files面板中,展开Targets区域,用鼠标右键点击应用程序目标,并选择Get Info。
3)确保选中General标签,点击Linked Libraries列表底部的Add (+),并且添加MapKit.framework(如图8-6所示)。
4)打开MappingExampleViewController.h文件,导入MapKit框架,并且创建一个实例变量来保存位置管理器(见程序清单8-6)。
图8-6 向项目中添加Map Kit框架
程序清单8-6 地图应用程序的头文件
5)切换到MappingExampleViewController.m文件,取消对viewDidLoad方法的注释,并且添加如下代码:
map = [[MKMapView alloc]
→initWithFrame:[self.view bounds]];
[self.view addSubview:map];
程序清单8-7给出了更新后的代码。
6)构建并运行应用程序(如图8-7所示)。
这就搞定了,只需要两行代码,就可以有一个地图。你可以在地图上导航,并且使用“收放”手势来实现放大/缩小。
图8-7 带有全屏MKMapView的应用程序
程序清单8-7 基本的地图应用程序的完整代码
我们现在更新代码,使其变得更有趣些。
在地图上显示你的位置:
1)打开MappingExampleViewController.m,并且更新viewDidLoad方法以便把地图类型设置为卫星视图,并告诉它显示当前的位置(用一个动画的蓝色标记表示):
map.mapType = MKMapTypeSatellite;
map.showsUserLocation = YES;
这个标记上外围的圆圈表示位置数据的精度,圆圈越粗,精确度越低:
CLLocationCoordinate2D coords;
coords.latitude = 37.331689;
coords.longitude = -122.030731;
2)接下来,创建一个变量来保存地图中心坐标,在这个例子中,就是Apple公司的总部:
float zoomLevel = 0.018;
MKCoordinateRegion region =
→MKCoordinateRegionMake(coords,
→MKCoordinateSpanMake(zoomLevel,
→zoomLevel));
[map setRegion:[map regionThatFits:
→region] animated:YES];
3)要缩放地图,我们需要创建一个MKCoordinateRegion。
这个结构不仅包含了地图应该居中的坐标,而且还有一个范围,后者由确定地图应该显示多少(以度为单位)的水平距离和垂直距离组成。较大的范围创建一个缩小的视图,较小的范围创建一个放大的视图(如图8-8所示)。程序清单8-8给出了更新后的viewDidLoad方法。
就像iPhone的本地Maps应用程序一样,我们可以使用mapType属性来显示3种可能的地图:
·MKMapTypeStandard—显示一个常规地图,包含街道和路名。如果没有指定的话,这是默认的地图类型。
·MKMapTypeSatellite—显示卫星视图。
·MKMapTypeHybrid—显示两种地图的组合,换句话说,卫星视图上覆盖有路和街道的信息。
提示
·在设置范围值的时候,根据所使用的地图类型,我们可以放大或缩小到一定的程度。例如,MKMapTypeSatellite的地图通常包含更多的细节,并且允许我们比MKTypeStandard放大更多。
图8-8 在地图上显示当前位置
程序清单8-8 更新设置和显示位置的代码
为了让地图应用更加丰富且有趣,我们通常在地图上附加信息,这也是注释的作用。
Map Kit包含了添加注释的支持,不仅可以是简单的“标签”注释(正如在本地的iPhone Maps应用程序中所见到的),而且可以是包含自己的感受的定制的注释。为地图添加注释,只需要在我们已经完成的基础上再略作改进。
为地图添加注释:
1)打开MappingExampleViewController.h,并向@interface:添加MKMapViewDelegate协议声明:
@interface MappingExampleView
→Controller : UIViewController
→<MKMapViewDelegate>
2)在MappingExampleViewController.m文件中,我们需要创建实现MKAnnotation协议的自己的定制类。至少,这个类必须实现coordinate属性。
3)在viewDidLoad中,设置委托,并且通过添加如下代码创建自己的注释:
customAnnotation *annotation =
→[[customAnnotation alloc]
→initWithCoordinate:coords];
annotation.title = @”The Title”;
annotation.subtitle = @”Subtitle”;
[map addAnnotation:annotation];
[annotation release];
我们已经删除setUserLocation:行,以便可以看到这些注释(否则,位置标记和注释将会出现在地图上的同一位置)。
4)最后,实现mapView:viewForAnnotation:委托方法,把注释显示为一个别针:
MKPinAnnotationView *pinView =
→(MKPinAnnotationView *) [map
→dequeueReusableAnnotationViewWith
→Identifier:annotation.title];
if (pinView == nil)
pinView = [[[MKPinAnnotationView
→alloc] initWithAnnotation:
→annotation reuseIdentifier:
→annotation.title] autorelease];
else
pinView.annotation = annotation;
程序清单8-9给出更新后的代码。
程序清单8-9 添加定制的注释的代码
程序清单8-9 (续)
mapView:viewForAnnotation:委托返回了一个MKAnnotationView对象。在这个例子中(如图8-9所示),我们使用MKPinAnnotationView子类,正如其名字所示,它把注释显示为别针。然而,如果希望注释有不同的外观,我们可以返回自己的子类。
我们可以在程序清单8-10中看到这个最简单的示例。我们在MKAnnotationView基类上设置image:属性。这将产生如图8-10所示的地图。
提示
·创建MKAnnotationView对象,以便当注释移动到屏幕外的时候(例如用户缩放或滚动地图)允许地图引擎删除注释,此时会指定一个复用的队列。当注释移动出屏幕的时候,从队列中取出它(也叫做出列)。
·我们也可以通过在定制的MKAnnotation View类中覆盖viewForCalloutAccessory Position:来改变注释的弹出视图(当用户触摸注释的时候出现的视图)的外观。
图8-9 在地图上显示一个注释
图8-10 显示图形的一个定制注释
程序清单8-10 把一幅图像显示为注释
Map Kit提供了一种工具,通过查找纬度和经度坐标来获取地址信息,这个过程叫做反向地理编码(reverse geocoding)。我们通过MKReverseGeocoder类及其委托方法来实现这一点。
在前面的例子中,我们手动创建自己的注释,在viewDidLoad中指定坐标标题和子标题。现在,我们将更改自己的代码,以对位置执行反向查找,创建一个注释,在弹出视图中显示地址。
添加反向地理编码:
1)打开MappingExampleViewController.h,并且向@interface添加MKReverseGeocode Delegate协议:
@interface MappingExampleView
→Controller : UIViewController
→<MKMapViewDelegate,
→MKReverseGeocoderDelegate>
我们还需要创建一个实例变量来保存反向地理编码器:
MKReverseGeocoder *geo;
程序清单8-11给出了更新后的代码。
程序清单8-11 更新后添加了反向地址编码的头文件
2)回到MappingExampleViewController.m中,更新viewDidLoad方法:
geo = [[MKReverseGeocoder alloc]
甶nitWithCoordinate:coords];
geo.delegate = self;
[geo start];
这里,我们创建地理编码器实例,设置委托,并且告诉它开始查找。
3)最后,我们需要实现MKReverseGeocode委托方法,如果找到地址的话,添加一个注释:
[map addAnnotation:placemark];
[geo cancel];
如果失败的话,在控制台上显示一条消息:
NSLog(@”geo error: %@”,error);
[geo cancel];
注意,我们在两种情况下都取消地理编码器。程序清单8-12给出了完整的代码。图8-11显示带有地址的应用程序。
提示
·在reverseGeocoder:didFindPlacemark:委托方法中,我们添加一个MKPlacemark作为注释。这个类包含用来保存位置信息(如城市或州)的属性。和前面我们自己定制的注释类相似,这个类支持MKAnnotation协议,因此它可以显示在地图上。
图8-11 在注释中显示地址
程序清单8-12 更新后的代码执行一次反向地理查找,并且把地址作为注释添加到地图上
发表评论
-
Objective-C 与 C++ 的异同
2013-04-02 12:03 1351http://www.cnblogs.com/y041039 ... -
Cocos2D-X是全球知名的开源跨平台手机游戏引擎
2013-01-22 10:05 2702http://www.oschina.net/p/cocos ... -
iOS Keyboard 键盘高度变化 自适应
2013-01-15 15:43 3211[[NSNotificationCenter default ... -
iOS使用自定义字体
2012-11-27 12:11 12062From: http://blog.csdn.net/csy1 ... -
4 款类似 Facebook/Path 切换效果的 iOS 组件
2012-11-27 12:03 2071From: http://blog.csdn.net/lia ... -
Path 2.0的UI界面设计详细介绍
2012-11-27 11:56 1419如Path的创始人Dave Morin ... -
史上最全的App Store邮箱列表
2012-11-27 11:51 1205From: http://roybaby.blog.51cto ... -
iOS从info.plist 获取项目的名称及版本号
2012-11-16 10:54 1559From: http://blog.sina.com.cn/s ... -
MapKit annotation drag and drop with callout info update
2012-10-13 10:38 2358http://hollowout.blogspot ... -
NSArray 或NSDictionary 调用writeToFile方法失败原因
2012-08-31 10:03 4415NSArray 或NSDictionary 调用writeTo ... -
如何让IOS应用从容地崩溃
2012-08-30 15:25 1566From: http://www.cocoachina.com ... -
iOS中判断设备系统版本
2012-08-29 17:17 31662在iOS开发中,经常要考虑系统的向下兼容,如果使用 ... -
iOS 汉字转拼音
2012-08-21 16:42 1417From: http://www.cnblogs.com/v2 ... -
iOS模拟器截图工具
2012-08-17 16:35 1568From: http://magicalboy.com/ios ... -
XCode下的iOS单元测试
2012-08-10 17:47 1111From: http://mobile.51cto.com/ ... -
AFNetworking
2012-08-08 10:54 4613AFNetworking on github: https:/ ... -
Wrapping Conventions
2012-08-01 15:54 772Wrapping Conventions ... -
Core Animation如何使显式动画结束时的值直接作用Layer
2012-08-01 14:51 3741(1)使用隐式动画会直接改变layer的属性值,如: ima ... -
How To Debug Memory Leaks with XCode and Instruments Tutoria
2012-07-31 16:30 1012From: http://www.raywenderlich. ... -
Using Properties in Objective-C Tutorial
2012-07-31 16:27 875From: http://www.raywenderlich. ...
相关推荐
iPhone MKMAPView中根据gps坐标画路径,可以支持google map缩放
CLLocation与MKMapView地图定位功能
MKMapView在中国显示地图和卫星图存在位置上的偏差,因此很多时侯在定位跟踪的时候常常是卫星定位而标准地图显示,因此常发现位置点不居中显示,当然这个可以使用开启用户位置跟踪模式来进行定位。本DEMO也正是利用...
系统地图MKMapView的定位及导航 UISearchController模糊查询点击每个UITableViewCell 在地图上显示大头针 ,点击大头针的右边到这里去,调用系统导航,模糊查询数据源来自百度api 写的有点简单,有点乱
TSClusterMapView, 用于iOS和OSX的动画集群 MKMapView TSClusterMapView - 带集群的MKMapView动画注释集群MKMapView子类基于 ADClusterMapView 。用法要运行示例项目,克隆 repo,然后从示例目录中运行 pod install ...
FlyoverKit:在 MKMapView 上实现 360° 俯视图.zip,360° flyover on a MKMapView
8.0以后的GPS定位问题,添加的一些配置信息
自定义 callout! 通过手势 添加多个气泡
在一个MKMapView上360° 展示一个高架公路
MKMapView自定义calloutView,完全自定义布局。。
在 MKMapView 中实现地址选择和导航功能。具有以下特点: 1:支持ios5~7 2:自定义MKAnnotationView 3:支持第三方导航功能、包括高德、百度、苹果、谷歌,以及绘制路线,类似微信发生地址 4:支持滑动地图,选择...
MTDirectionsKit, 在MKMapView之上,直接显示方向 为什么 MTDirectionsKit?为什么苹果没有为你提供直接显示在MKMapView之上的方法,强迫你在中 switch,只是为了引导你的用户在某个地方。 我们也是这样,所以我们...
NULL 博文链接:https://chinaxxren.iteye.com/blog/1150309
kingpin, 在MKMapView的地图注释集群库中, kingpin一种面向iOS的MKAnnotation集群库。 特性使用 2-d 树,以实现最大性能。无需子类化,使库易于与现有项目集成。安装 CocoaPods要在 Podfile 中获得稳定的发行版,请...
RxMKMapView是MKMapView(MapKit) delegate的包装器,提供了React式委托代理以及可绑定的注释接口,以动态更改地图的“数据源”。 安装 RxMKMapView可通过。 要安装它,只需将以下行添加到您的Podfile中: pod ...
最近使用MKMapView,发现有内存泄露。经查发现属iOS系统 bug,详情我发表的文章:http://blog.csdn.net/rigel_xu/article/details/52146774
从 MKMapView 取出来的经纬度去 Google Maps API 做逆地址解析终于对了。去百度地图API做逆地址解析,依旧是错的! 从上面两处取的经纬度放到百度地图上显示都是错的!错的!的! 分为 地球坐标,火星坐标(iOS...
实现地图标注(Annotation)的拖放、移动效果。用户可以用手指按住地图上的annotation,从而对其进行拖放、移动位置。当用户拖放annotation时,annotation旁边还出现投影效果。 注意:请在Mac下解压使用
STLocationRequestController在STLocationRequestController显示了一个漂亮的3D 360°Flyover-MapView bult,包含25多个城市和地标。 安装 可可豆 STLocationRequest可通过。 要安装它,只需将以下行添加到您的...
ios 地图开发sample code,画路线图。