MapKit是苹果公司开发的用于显示地图和实现定位、导航的地图框架。

MapKit View可以通过storyboard、xib创建,也可以通过代码直接创建。

需要注意的是,通过storyboard和xib创建的话,需要手动导入MapKit框架,否则会报错,因为storyboard、xib无法解析MKMapView这个类。

要使用此框架,首先手动导入框架(以便在storyboard和xib上使用),然后引用框架的主头文件和CoreLocation的主头文件:

#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

我们这里演示通过storyboard创建的mapView,为了方便定位和反地理编码,创建下面的成员属性:

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) CLLocationManager *locMgr;
@property (strong, nonatomic) CLGeocoder *gcoder;

【地图的基本属性】

对于地图的设置,主要有下面几个:

①地图类型:有标准、卫星、混合三种,默认为标准。

// 设置地图位置
/*
typedef enum : NSUInteger {
MKMapTypeStandard,
MKMapTypeSatellite,
MKMapTypeHybrid
} MKMapType;
*/
self.mapView.mapType = MKMapTypeStandard;

②地图追踪模式:有不追踪、追踪位置、追踪位置和方向三种,注意要完成定位授权才行。

// 追踪位置
/*
typedef NS_ENUM(NSInteger, MKUserTrackingMode) {MKUserTrackingModeNone = 0, // the user's location is not followedMKUserTrackingModeFollow, // the map follows the user's locationMKUserTrackingModeFollowWithHeading, // the map follows the user's location and heading
}
*/
self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;

授权的代码如下,注意iOS8还要加入在info.plist中加入NSLocationAlwaysUsageDescription。

_locMgr = [[CLLocationManager alloc] init];
[_locMgr requestAlwaysAuthorization];

③地图的转动允许:默认是可以用双手转动地图的。

// 不允许转动地图
self.mapView.rotateEnabled = NO;

④地图的代理:地图的相关方法都是通过代理实现,因此设置代理十分重要。

self.mapView.delegate = self;

【地图的代理方法】

①didUpdateUserLocation,每次用户位置改变时调用。

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;

MKUserLocation是用户地理位置信息的数据模型,用户在地图上是一个大头针,这个大头针的数据通过userLocation模型设置,因此通过获取和修改userLocation可以获取、改变用户位置。

MKUserLocation中常用的属性有location、title、subtitle,location是用户位置,title和subtitle是点击用户大头针时显示的标题和副标题,需要手动设置。

下面的代码演示了通过反地理编码获取到当前位置的城市名、位置全名显示在标题和副标题。

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{// 地图上当前位置也属于一个大头针,可以拥有标题、子标题和位置信息。// 大头针上的内容由模型确定,这个模型就是MKUserLocation// 通过修改模型属性影响大头针标题和副标题[_gcoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *pm = [placemarks firstObject];userLocation.title = pm.addressDictionary[@"City"];userLocation.subtitle = pm.name;}];}

除此之外,观察地图类App,打开时应当自动定位到用户的位置,用户位置改变时应当自动跟随用户。

对于iOS8,这个功能被自动的实现,而iOS8以前需要手动设置,通过两个方法,一个用于设置当前地图的经纬跨度,一个用于设置地图的中心区域。

注意iOS8不能再调用,否则会崩溃:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{// 地图上当前位置也属于一个大头针,可以拥有标题、子标题和位置信息。// 大头针上的内容由模型确定,这个模型就是MKUserLocation// 通过修改模型属性影响大头针标题和副标题[_gcoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *pm = [placemarks firstObject];userLocation.title = pm.addressDictionary[@"City"];userLocation.subtitle = pm.name;}];// 对于iOS8以前,设置地图跨度与中心位置。if([[UIDevice currentDevice].systemVersion doubleValue] < 8.0){NSLog(@"7");// iOS8.0和以后会自动移动大头针// 移动地图到当前大头针[mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];//放大地图,以便看清当前路线[mapView setRegion:MKCoordinateRegionMake(userLocation.location.coordinate, MKCoordinateSpanMake(0.1, 0.1)) animated:YES];}}

②regionWillChangeAnimated和regionDidChangeAnimated,拖动地图时会调用Will,拖动完成后调用Did方法。

mapView中有region属性,可以获取当前地图的区域信息,例如中心点坐标、跨度:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{NSLog(@"区域即将改变");}-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{NSLog(@"区域改变");NSLog(@"%f %f",self.mapView.region.span.latitudeDelta,self.mapView.region.span.longitudeDelta);}

转载于:https://www.cnblogs.com/aiwz/p/6154122.html

(七十九)MapKit的基本使用相关推荐

  1. JavaScript学习(七十九)—值传递和地址传递

    JavaScript学习(七十九)-值传递和地址传递 一.值传递 二.地址传递

  2. 【genius_platform软件平台开发】第七十九讲:Linux系统中可执行程序后台运行的几种方式

    [genius_platform软件平台开发]第七十九讲:Linux系统中可执行程序后台运行的几种方式 1. 问题描述 2. & 符号 3. nohup指令 4. ctrl + z.jobs. ...

  3. osgEarth的Rex引擎原理分析(七十九)如何加载百度、高德、谷歌、微软的在线地图

    目标:(七十八)中的问题155 瓦片生成后,就是一堆图片.怎么对这堆图片进行编号,是目前主流互联网地图商分歧最大的地方.总结起来分为四个流派: 谷歌XYZ:Z表示缩放层级,Z=zoom:XY的原点在左 ...

  4. 数据库管理-第七十九期 儿童节惊魂(20230601)

    数据库管理 2023-06-01 第七十九期 儿童节惊魂 1 主板挂了? 2 时间同步 3 数据库参数 4 ACFS 5 两个错误 总结 第七十九期 儿童节惊魂 6月第一天,又是儿童节,加上客户现场来 ...

  5. ★【世龙最爱之作】☆【丑丫头变身美女校花,不恋情的人懊恼,可是有了爱情之后更烦恼】第七十九章★

    丑丫头变身美女校花第七十九章 全部烧烤大餐,终极仍是以快活满意的主旋律,在一个半小时之后完善的停止了.合法大家都整理筹备散场的时候. 沈芳突然道:"要不,大家去唱歌吧?" 吴以默立 ...

  6. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  7. 《东周列国志》第七十九回 归女乐黎弥阻孔子 栖会稽文种通宰嚭

    话说齐侯自会夹谷归后,晏婴病卒.景公哀泣数日,正忧朝中乏人,复闻孔子相鲁,鲁国大治,惊曰:"鲁相孔子必霸,霸必争地,齐为近邻,恐祸之先及,奈何?"大夫黎弥进曰:"君患孔子 ...

  8. 一个屌丝程序猿的人生(七十九)

    第二天,林萧还不到7点,就从床上爬了起来. 虽说和公司约好的面试时间是10点,距离开始还有3个多小时,但林萧昨天查了下路线,路上要转一趟公交车,而且要途径差不多15个公交站,虽说地图上写的预估时间是1 ...

  9. 七十九、Springboot 整合 Elasticsearch

    @Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 文章目录 Elastic ...

最新文章

  1. 在VM虚拟机中 CentOS7安装VMware Tools(超级详解)
  2. 【笔记】HMM在股票指数中的简单应用
  3. 四大发明之活字印刷——面向对象思想的胜利
  4. 问题与解答 [Questions Answers]
  5. 140种Python标准库、第三方库和外部工具都有了
  6. 无法打开caffe.pb.h, no such file or directory错误
  7. Java实训项目5:GUI学生信息管理系统 - 实现步骤 - 创建数据库与表
  8. 学习Haskell的一些资料
  9. 好想学python机器人_拥有自动学习的Python机器人-ChatterBot
  10. 计算机毕业论文答辩申请书,论文答辩申请书范文6篇
  11. java财务对账系统设计_对账系统设计
  12. 多标签文本分类/三种神经网络/网络模型
  13. C语言求若干个数的均值和方差
  14. IE取消或设置代理服务器脚本
  15. 【Android】虚拟环绕声
  16. android 斜边_Android -- 一个滑动旋转的弧形菜单
  17. Presto 在美图的实践
  18. gif表情制作一键轻松搞定,教你自制gif表情
  19. 单片机很好玩 ,制作呼吸灯(转载)
  20. 【电针驱动迷走-肾上腺轴的神经解剖学基础】A neuroanatomical basis for electroacupuncture to drive the vagal– adrenal axis

热门文章

  1. 配置Windows server 2008 R2脱机加入域功能
  2. Fiddler抓包1-抓firefox上https请求
  3. 爬虫9-淘宝商品信息定向爬虫
  4. 【DB2】db2命令Export与Import
  5. adchos 文本混淆工具
  6. 金融新手投标模块布局小Demo
  7. [转载]玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo...
  8. C# 错误!!容量超出了最大容量。参数名: capacity 这个是什么问题呢?
  9. PostgreSQL的 initdb 源代码分析之九
  10. Android开发之自定义Spinner样式的效果实现(源代码实现)