(七十九)MapKit的基本使用

时间:2022-09-15 17:12:28

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 followed
MKUserTrackingModeFollow, // the map follows the user's location
MKUserTrackingModeFollowWithHeading, // 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); }

(七十九)MapKit的基本使用的更多相关文章

  1. 第三百七十九节,Django&plus;Xadmin打造上线标准的在线教育平台—xadmin的安装

    第三百七十九节,Django+Xadmin打造上线标准的在线教育平台—xadmin的安装 xadmin介绍 xadmin是基于Django的admin开发的更完善的后台管理系统,页面基于Bootstr ...

  2. &OpenCurlyDoubleQuote;全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. (七十九)c&num;Winform自定义控件-导航菜单

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. 第七十九,CSS3背景渐变效果

    CSS3背景渐变效果 学习要点: 1.线性渐变 2.径向渐变 本章主要探讨HTML5中CSS3背景渐变功能,主要有两种渐变方式:线性渐变和径向 (放射性)渐变. 一.线性渐变 linear-gradi ...

  5. salesforce零基础学习(七十九)简单排序浅谈 篇一

    我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的场景.篇一只是简单的描述一下选择排序,插 ...

  6. Java开发笔记(七十九)利用反射技术操作私有属性

    早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装.继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性 ...

  7. 第七十九课 最短路径(Floyd)

    程序如下: #ifndef GRAPH_H #define GRAPH_H #include "Object.h" #include "SharedPointer.h&q ...

  8. C&num;编程(七十九)---------- 反射

    反射 在介绍翻着之前,先说两个小案例 B超:什么叫B超呢?就是透过肚皮能看到你内脏的情况,不用打开肚子才能看.这是什么样的一种技术呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声 ...

  9. 【leetcode 简单】 第七十九题 区域和检索 - 数组不可变

    给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数 ...

随机推荐

  1. 设计模式学习之观察者模式(Observer&comma;行为型模式)(7)

    1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3 ...

  2. sqrt 源代码

    stap -v -e 'probe process("/usr/local/mysql56/bin/mysqld").function("*@/usr/src/mysql ...

  3. Sqoop导入导出的几个例子

    Sqoop导入导出的几个例子 http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_importing_data_into_hive   no ...

  4. 【XSY1594】棋盘控制 概率DP

    题目描述 给你一个\(n\times m\)的棋盘,每次随机在棋盘上放一个国际象棋中的车,不能和以前放的重叠.每个车可以控制当前行和当前列.当所有行和所有列都被控制时结束游戏.问你结束时期望放了多少个 ...

  5. js 监听事件的叠加和移除

    html DOM元素有很多on开头的监听事件,如onload.onclick等,见DOM事件列表.但是同一种事件,后面注册的会覆盖前面的: window.onresize = function(){ ...

  6. CSS 外边距

    CSS 外边距围绕在元素边框的空白区域是外边距.设置外边距会在元素外创建额外的“空白”. 设置外边距的最简单的方法就是使用 margin 属性,这个属性接受任何长度单位.百分数值甚至负值. ##### ...

  7. Capture HTML Canvas as gif&sol;jpg&sol;png&sol;pdf&quest;

    https://*.com/questions/923885/capture-html-canvas-as-gif-jpg-png-pdf https://stackoverf ...

  8. scrapy instantiation

    start from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'jokespider']) items.py import ...

  9. Android 反编译神器jadx的使用

    一.前言 今天介绍一个非常好用的反编译的工具 jadx .jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求. jadx 优点: 图形化的界面. 拖拽式的操作. 反编译输出 Java 代码 ...

  10. 【C&plus;&plus; 拾遗】C&plus;&plus;&&num;39&semi;s most vexing parse

    C++'s most vexing parse 是 Scott Meyers 在其名著<Effective STL>中创造的一个术语. Scott 用这个术语来形容 C++ 标准对于 de ...