一、MapKit介绍

1、苹果自带地图功能(高德地图),可以提供地图展示,查询,定位,导航等功能。使用MapKit框架实现地图功能,MapKit框架中所有数据类型的前缀都是MK

2、MapKit有一个比较重要的UI控件 :MKMapView,专门用于地图显示

3、跟踪显示用户的位置

(1)设置MKMapView的userTrackingMode属性可以跟踪显示用户的当前位置

   <1>MKUserTrackingModeNone :不跟踪用户的位置

  <2>MKUserTrackingModeFollow :跟踪并在地图上显示用户的当前位置

  <3>MKUserTrackingModeFollowWithHeading :跟踪并在地图上显示用户的当前位置,地图会跟随用户的前进方向进行旋转

4、地图类型

(1)可以通过设置MKMapView的mapViewType设置地图类型

  <1>MKMapTypeStandard :普通地图(左图)

  <2>MKMapTypeSatellite :卫星云图 (中图)

  <3>MKMapTypeHybrid :普通地图覆盖于卫星云图之上(右图)

  

5、MKMapView的代理

(1)MKMapView可以设置一个代理对象,用来监听地图的相关行为

(2)常见的代理方法有

  <1>一个位置更改默认只会调用一次,不断监测用户的当前位置,每次调用,都会把用户的最新位置(userLocation参数)传进来

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

  

   <2>地图的显示区域即将发生改变的时候调用

  - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;

  

   <3>地图的显示区域已经发生改变的时候调用

  - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;

(3)MKUserLocation其实是个大头针模型,包括以下属性

  <1>显示在大头针上的标题

  @property (nonatomic, copy) NSString *title;

  <2>显示在大头针上的子标题

  @property (nonatomic, copy) NSString *subtitle;

  <3>地理位置信息(大头针钉在什么地方?)

  @property (readonly, nonatomic) CLLocation *location;

6、设置地图的显示

(1)通过MKMapView的下列方法,可以设置地图显示的位置和区域

(2)设置地图的中心点位置

  @property (nonatomic) CLLocationCoordinate2D centerCoordinate;

  - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;

(3)设置地图的显示区域

  @property (nonatomic) MKCoordinateRegion region;

  - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

(4)MKCoordinateRegion是一个用来表示区域的结构体,定义如下

  typedef struct {

       CLLocationCoordinate2D center; // 区域的中心点位置

       MKCoordinateSpan span; // 区域的跨度

  } MKCoordinateRegion;

(5)MKCoordinateSpan的定义

  typedef struct {

     CLLocationDegrees latitudeDelta; // 纬度跨度

    CLLocationDegrees longitudeDelta; // 经度跨度

  } MKCoordinateSpan;

7、大头针视图和大头针模型的概念

(1)大头针视图是根据大头针模型生成的。

(2)不重写代理方法返回大头针视图,则使用系统默认的红色大头针,一个模型对应一个大头针。

(3)大头针的基本操作

  <1>添加一个大头针

  - (void)addAnnotation:(id <MKAnnotation>)annotation;

  <2>添加多个大头针

  - (void)addAnnotations:(NSArray *)annotations;

  <3>移除一个大头针

  - (void)removeAnnotation:(id <MKAnnotation>)annotation;

  <4>移除多个大头针

  - (void)removeAnnotations:(NSArray *)annotations;

  <5>(id <MKAnnotation>)annotation 大头针模型对象:用来封装大头针的数据,比如大头针的位置、标题、子标题等数据

7、大头针模型

(1)MKAnnotation是个协议,只有遵守了该协议的对象,才可作为大头针模型(协议中的属性都是readonly,没法用,所以要自定义模型类)

(2)新建一个大头针模型类(示例)

#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject <MKAnnotation>

/** 坐标位置 */

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

/** 标题 */

@property (nonatomic, copy) NSString *title; 

/** 子标题 */

@property (nonatomic, copy) NSString *subtitle; 

@end

(3)通过模型,添加默认的大头针

MyAnnotation *anno = [[MyAnnotation alloc] init];

anno.title = @“如家酒店”;

anno.subtitle = @“长安街88888号”;

anno.coordinate = CLLocationCoordinate2DMake(40, 116);

[self.mapView addAnnotation:anno];

8、自定义大头针

(1)方法:设置MKMapView的代理,实现下面的代理方法,返回大头针控件

  - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

  根据传进来的(id <MKAnnotation>)annotation参数创建并返回对应的大头针控件

(2)代理方法的使用注意

  <1>如果返回nil,显示出来的大头针就采取系统的默认样式

  <2>标识用户位置的蓝色发光圆点,它也是一个大头针,当显示这个大头针时,也会调用代理方法

  <3>需要在代理方法中分清楚(id <MKAnnotation>)annotation参数代表自定义的大头针还是蓝色发光圆点

  <4>模型生成视图,有模型才有视图,并且每个模型都会调用代理方法

(3)示例代码

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

{

    // 判断annotation的类型

    if (![annotation isKindOfClass:[BaseAnnotation class]]) return nil;

    // 创建MKAnnotationView,可复用的控件

    static NSString *ID = @“Hotel”;

    MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    if (annoView == nil) {

        annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];   

// 是否可显示大头针弹框

annoView.canShowCallout = YES;

    }

    // 传递模型数据

    annoView.annotation = annotation;

    // 设置图片(图片在另外的模型中)

    BaseAnnotation * baseAnnotation = annotation;

    annoView.image = [UIImage imageNamed:baseAnnotation.icon];

    return annoView;

}

9、MKAnnotationView

(1)地图上的大头针控件是MKAnnotationView

(2)MKAnnotationView的属性

  <1>大头针模型

  @property (nonatomic, strong) id <MKAnnotation> annotation;

  <2>显示的图片

  @property (nonatomic, strong) UIImage *image;

  <3>是否显示标注

  @property (nonatomic) BOOL canShowCallout;

  <4>标注(弹框)的偏移量

  @property (nonatomic) CGPoint calloutOffset;

  <5>标注(弹框)右边显示什么控件

  @property (strong, nonatomic) UIView *rightCalloutAccessoryView;

  <6>标注(弹框)左边显示什么控件

  @property (strong, nonatomic) UIView *leftCalloutAccessoryView;

10、MKPinAnnotationView

(1)MKPinAnnotationView是MKAnnotationView的子类,其实就是系统提供的又一种大头针样式

(2)MKPinAnnotationView比MKAnnotationView多了2个属性

  <1>大头针颜色

  @property (nonatomic) MKPinAnnotationColor pinColor;

  <2>大头针第一次显示时是否从天而降(动画效果)

  @property (nonatomic) BOOL animatesDrop;

11、自定义大头针弹框视图(标注视图)

(1)点击大头针可以显示出一个弹框(标注),系统默认有格式,在上面描述过了

(2)模仿系统,自定义一个弹框:思路—————在原来的位置,再生成一个大头针视图,此视图采用继承自MKAnnotationView的自定义视图(类似自定义cell)

二、导航的简单使用

1、使用框架MapKit、CoreLocation

2、创建 MKMapItem 地图元素

3、实例代码

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()
@property (nonatomic, strong) CLGeocoder *geocoder;
@end @implementation ViewController
- (CLGeocoder *)geocoder
{
if (!_geocoder) {
_geocoder = [[CLGeocoder alloc]init];
}
return _geocoder;
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// 设定:北京 到 广州 [self.geocoder geocodeAddressString:@"上海" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { MKPlacemark *plmk = [[MKPlacemark alloc]initWithPlacemark:[placemarks firstObject]]; MKMapItem *item1 = [[MKMapItem alloc]initWithPlacemark:plmk]; [self.geocoder geocodeAddressString:@"四川" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { MKPlacemark *plmkgz = [[MKPlacemark alloc]initWithPlacemark:[placemarks firstObject]]; MKMapItem *item2 = [[MKMapItem alloc]initWithPlacemark:plmkgz]; //设置参数字典:交通方式,地图样式、显示路况方式等等
NSDictionary *dict = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsMapTypeKey : @2}; //参数1 数组 存放的是起点和终点 参数2 步行 驾车 是否显示交通路况等 [MKMapItem openMapsWithItems:@[item1,item2] launchOptions:dict];
}]; }];
} @end

三、地图画线

1、使用框架MapKit

2、使用MKDirections 方向对象添加蒙版

3、使用MKMapViewDelegate的代理方法改变折线的属性(蒙版属性)

4、实例代码

#import "ViewController.h"
#import <MapKit/MapKit.h> @interface ViewController ()<MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) CLGeocoder *geoCoder;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.mapView.delegate = self;
self.geoCoder = [[CLGeocoder alloc]init];
[self.geoCoder geocodeAddressString:@"北京" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
MKPlacemark *mkplgz = [[MKPlacemark alloc]initWithPlacemark:[placemarks firstObject]]; [self.geoCoder geocodeAddressString:@"广州" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
// 1.北京 广州
// 2.颜色 线宽
MKDirectionsRequest *request = [[MKDirectionsRequest alloc]init]; MKPlacemark *mkplbg = [[MKPlacemark alloc]initWithPlacemark:[placemarks firstObject]];
request.source = [[MKMapItem alloc]initWithPlacemark:mkplbg];
request.destination = [[MKMapItem alloc]initWithPlacemark:mkplgz];
//方向对象
MKDirections *directions = [[MKDirections alloc]initWithRequest:request];
//遮盖 蒙版
//添加遮盖的模型 [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) { //response
//line
for (MKRoute *route in response.routes) { [self.mapView addOverlay:route.polyline]; } }]; }]; }];
}
//添加折线模型的时候就会找代理返回一个折线的渲染器来决定线的颜色线宽
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{ MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc]initWithOverlay:overlay]; polylineRenderer.lineWidth = 2; polylineRenderer.strokeColor = [UIColor orangeColor]; return polylineRenderer; }
@end

地图使用-----MapKit介绍的更多相关文章

  1. 【iOS】7.4 定位服务->3.1 地图框架MapKit 功能1:地图展示

    > 本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. --- > 本文相关目录: ================== 所属文集:[[ ...

  2. iOS:地图:MapKit和CoreLocation

    地图:MapKit和CoreLocation 简介: 现在很多的社交软件都引入了地图和定位功能,要想实现这2大功能,那就不得不学习其中的2个框架:MaKit和CoreLocation CoreLoca ...

  3. 【iOS】7.4 定位服务->3.2 地图框架MapKit 功能2:路线规划(导航)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  4. 【iOS】7.4 定位服务->3.3 地图框架MapKit 功能3:3D视图

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  5. 【iOS】7.4 定位服务->3.4 地图框架MapKit 功能4:地图截图

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. iOS 原生地图(MapKit、MKMapView)轨迹渐变

    WechatIMG2.png 项目已接入高德地图,并且大部分功能已经实现好,但BOSS觉得iOS自带的地图效果更好...本着面向老板编程的思想,换之.还好,高德地图是在MapKit上封装的,大部分ap ...

  7. 百度地图API使用介绍

    百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html> 2. <head& ...

  8. 百度地图API详细介绍

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <t ...

  9. iOS开发系列--地图与定位

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个 ...

随机推荐

  1. 正则表达式提取String子串

    最近遇到了一个字符串处理的功能,忽然发现了正则表达式的强大,深深的被她的迷人魅力所吸引,以前只是听说,今天亲眼所见,亲身经历,真的彻底折服. 言归正传:java中String类里面封装了很多字符串处理 ...

  2. Stanford coursera Andrew Ng 机器学习课程第二周总结(附Exercise 1)

    Exercise 1:Linear Regression---实现一个线性回归 重要公式 1.h(θ)函数 2.J(θ)函数 思考一下,在matlab里面怎么表达?如下: 原理如下:(如果你懂了这道作 ...

  3. C# 计算百分比

    //计算比率 decimal A =(decimal) 200.20; decimal B = (decimal)1000.20; decimal t = decimal.Parse((A/B).To ...

  4. SpringMVC与MyBatis整合方法

    一.springmvc+mybaits的系统架构: 第一步:整合dao层 mybatis和spring整合,通过spring管理mapper接口. 使用mapper的扫描器自动扫描mapper接口在s ...

  5. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列

    Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  6. Configuring SSL on Enterprise Manager and the SLB (Release 12.1.0.2 and later)

    From: http://docs.oracle.com/html/E24089_42/ha_setup.htm#sthref833 If the SLB is configured to use T ...

  7. VsCode 格式化插件配置

    Beautify 1.在工作目录下建立.jsbeautifyrc文件: { "brace_style": "none,preserve-inline", &qu ...

  8. 8.mysql执行语句的顺序

    mysql执行语句的顺序     一.group by + where group by 字句和where条件语句结合在一起使用,where在前,group by 在后.即先对select xx fr ...

  9. Jupyter Notebook 下安装 PHP 内核

    我最近被强烈安利了 Jupyter Notebook 这个交互式笔记本.然后试用了它自带的 Python 内核后,这个应用整体给我的感觉很不错,就去搜索了下它所支持的其它内核 Jupyter Kern ...

  10. PAT 1096. Consecutive Factors

    Among all the factors of a positive integer N, there may exist several consecutive numbers. For exam ...