一:MapKit基本介绍
  • XIB
  • 代码
二:框架没有导入
在Xcode5之后我们不需要在工程中导入苹果的框架,也就是,苹果会自动为神马导入,但是有几个前提
  • 1:你必须import这个框架
  • 2:你必须在项目中使用(需要第一个条件的支持)
只要上面每个条件不满足都会报上名的错误
三:基本属性的使用
 1     // 1.设置地图显示类型
 2     /**
 3         MKMapTypeStandard = 0,  // 标准
 4         MKMapTypeSatellite,     // 卫星
 5         MKMapTypeHybrid,        // 混合(标准+卫星)
 6         MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体卫星
 7         MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体混合
 8      */
 9     self.customMapView.mapType = MKMapTypeHybridFlyover;
10
11
12     // 2.设置地图的跟随模式
13     //(注意:设置此属性会使用到用户的位置隐私,所以需要请求用户授权,否则没有效果)
14     /**
15         MKUserTrackingModeNone = 0, // 不跟随
16         MKUserTrackingModeFollow, // 跟随用户位置
17         MKUserTrackingModeFollowWithHeading, // 跟随用户位置,并跟随用户方向
18      */
19     [self locationM];
20     self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
21
22
23     // 3.设置地图其它属性(操作)
24     /** 注意:设置对应的属性时,注意该属性是从哪个系统版本开始引入的,做好不同系统版本的适配*/
25     // 是否可以缩放
26     self.customMapView.zoomEnabled = NO;
27     // 是否可以滚动
28     self.customMapView.scrollEnabled = NO;
29     // 是否可以旋转
30     self.customMapView.rotateEnabled = NO;
31     // 是否显示3D
32     self.customMapView.pitchEnabled = NO;
33
34     // 4.设置地图其它属性(显示)
35     // 是否显示指南针
36     self.customMapView.showsCompass = YES;
37     // 是否显示比例尺
38     self.customMapView.showsScale = YES;
39     // 是否显示交通
40     self.customMapView.showsTraffic = YES;
41     // 是否显示建筑物
42     self.customMapView.showsBuildings = YES;
43  
四:中级使用,地图的显示
 1     // 测试显示中国地图全貌(经度范围:73°33′E至135°05′E  纬度范围:3°51′N至53°33′N)
 2 //    MKCoordinateSpan span = MKCoordinateSpanMake(50, 64);
 3 //    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(28, 104);
 4 //    MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
 5 //    [self.customMapView setRegion:region animated:YES];
 6
 7     // 根据调整的合适区域跨度 设置地图的显示区域
 8     MKCoordinateSpan span = MKCoordinateSpanMake(0.064695, 0.040670);
 9     CLLocationCoordinate2D center = self.customMapView.region.center;
10     MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
11     [self.customMapView setRegion:region animated:YES];
实现对应的呃方法
 1 #pragma mark -MKMapViewDelegate
 2 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 3 {
 4     /**
 5      MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
 6      location:  用户当前所在位置信息(CLLocation对象)
 7      title:     大头针标注要显示的标题(NSString对象)
 8      subtitle:  大头针标注要显示的子标题(NSString对象)
 9      */
10     // 根据用户当前位置的经纬度,设置地图显示中心
11     /**
12         存在弊端:地图显示比例过大,无法调整
13         解决方案:直接使用对应的调整地图“显示区域”的API
14      */
15 //    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
16     /**
17       MKCoordinateSpan 跨度解释:
18       latitudeDelta:纬度跨度,因为南北纬各90度,所以此值的范围是(0---180);此值表示,整个地图视图宽度,显示多大跨度
19       longitudeDelta:经度跨度,因为东西经各180度,所以此值范围是(0---360):此值表示,整个地图视图高度,显示多大跨度
20      注意:地图视图显示,不会更改地图的比例,会以地图视图高度或宽度较小的那个为基准,按比例调整
21      */
22 //    MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
23 //    MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, span);
24 //    [mapView setRegion:region animated:YES];
25 }
26
27 // 当地图区域(跨度)改变时调用
28 -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
29 {
30     NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
31 }
32  
注:
 1     /**
 2      存在弊端:
 3         iOS8.0之前,地图不会自动滚到用户所在位置
 4      解决方案:
 5         当地图获取到用户位置之后,使用代码移动地图显示中心
 6         1. 设置地图代理,在地图获取用户位置代理方法中操作
 7         2. 可以设置地图显示中心/设置地图显示区域
 8      */
 9     self.customMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
10
11
12  
五:高级使用(大头针)
使用自定义的大头针(因为系统的是只读的)
创建一个类继承自NSobject并且遵守 MKAnnotation协议就可以,然后再里面定义大头症中需要的属性
 1 // 大头针所在经纬度(订在地图哪个位置)
 2 @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
 3
 4
 5 // 大头针标注显示的标题
 6 @property (nonatomic, copy, nullable) NSString *title;
 7 // 大头针标注显示的子标题
 8 @property (nonatomic, copy, nullable) NSString *subtitle;
 9
10
11 @property (nonatomic, assign) AnnotationType AT;
12  
这里需要一个枚举类型
1 typedef enum{
2     AnnotationTypeMovie,
3     AnnotationTypeHotel
4 } AnnotationType;
5
6  
再需要使用大头针的方法类中,添加一个大头针
 1
 2
 3
 4     // 获取当前触摸点在地图上的坐标
 5     UITouch *touch = [touches anyObject];
 6     CGPoint touchPoint = [touch locationInView:self.customMapView];
 7     // 将坐标转换为经纬度
 8     CLLocationCoordinate2D center = [self.customMapView convertPoint:touchPoint toCoordinateFromView:self.customMapView];
 9
10     [self addAnnotationWithCoordinate:center];
11
12
13
14
15 // 根据经纬度坐标添加大头针
16 - (void)addAnnotationWithCoordinate:(CLLocationCoordinate2D)coordinate
17 {
18     XMGAnnotation *annotation = [[XMGAnnotation alloc] init];
19
20     annotation.coordinate = coordinate;
21     annotation.title = @"捉妖记";
22     annotation.subtitle = @"呆萌的胡巴";
23     annotation.AT = AnnotationTypeHotel;
24     [self.customMapView addAnnotation:annotation];
25
26 // TODO: 可以自己尝试使用反地理编码,获取当前经纬度所在位置信息,用作大头针标注的标题和子标题
27
28 }
当我们不需要的时候,比如View不再显示的时候就需要移除这个大头针
1 // 移除地图上所有大头针
2 - (void)removeAllAnnotation
3 {
4     NSArray *annotations = self.customMapView.annotations;
5     [self.customMapView removeAnnotations:annotations];
6 }
7  
更新地图
 1 #pragma mark -MKMapViewDelegate
 2 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
 3 {
 4     /**
 5      MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
 6      location:  用户当前所在位置信息(CLLocation对象)
 7      title:     大头针标注要显示的标题(NSString对象)
 8      subtitle:  大头针标注要显示的子标题(NSString对象)
 9      */
10     userLocation.title = @"小码哥";
11     userLocation.subtitle = @"小码哥总部";
12 }
13
14   
自定义大头针数据模型,实现选中和移动功能
 1 // 当添加大头针数据模型时,会调用此方法,获取对应的大头针视图。如果返回nil,则默认使用系统自带的大头针视图。
 2 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(XMGAnnotation *)annotation
 3 {
 4
 5 // TODO: 将自定义大头针视图进行封装,完善自定义的大头针数据模型
 6
 7     // 自定义大头针
 8     static NSString *pinID = @"pinID";
 9     MKAnnotationView *customPinView = [mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
10     if (!customPinView) {
11         customPinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinID];
12     }
13
14     // 设置大头针图片
15     NSString *imageName = nil;
16
17     switch (annotation.AT) {
18         case AnnotationTypeMovie:
19             imageName = @"category_5";
20         case AnnotationTypeHotel:
21             imageName = @"category_3";
22             break;
23
24         default:
25             break;
26     }
27     customPinView.image = [UIImage imageNamed:imageName];
28     // 设置大头针可以弹出标注
29     customPinView.canShowCallout = YES;
30     // 设置标注左侧视图
31     UIImageView *leftIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
32     leftIV.image = [UIImage imageNamed:@"huba.jpeg"];
33     customPinView.leftCalloutAccessoryView = leftIV;
34
35     // 设置标注右侧视图
36     UIImageView *rightIV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
37     rightIV.image = [UIImage imageNamed:@"eason.jpg"];
38      customPinView.rightCalloutAccessoryView = rightIV;
39
40     // 设置标注详情视图(iOS9.0)
41 //    customPinView.detailCalloutAccessoryView = [[UISwitch alloc] init];
42
43     return customPinView;
44
45
46 #pragma mark - 华丽的分割线------------当我们返回nil时,系统大致实现方案-----------------
47     return nil;
48 //     当我们返回nil时,系统大致实现方案如下
49 //     1. 大头针系统对应的视图是 MKPinAnnotationView,它继承自 MKAnnotationView
50 //     2. 地图上的大头针视图,和tableview上的cell一样,都使用“循环利用”的机制
51     static NSString *pinID = @"pinID";
52     MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pinID];
53     if (!pinView) {
54         pinView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:pinID];
55     }
56     pinView.annotation = annotation;
57
58 // 弹出标注
59     pinView.canShowCallout = YES;
60
61     // 修改大头针颜色
62     pinView.pinColor = MKPinAnnotationColorPurple;
63
64     // 设置大头针从天而降
65     pinView.animatesDrop = YES;
66
67     // 设置大头针可以被拖拽(父类中的属性)
68     pinView.draggable = YES;
69
70
71     return pinView;
72     return nil;
73 }
74
75 // 选中一个大头针时调用
76 -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
77 {
78     NSLog(@"选中%@", [view.annotation title]);
79 }
80
81 // 取消选中大头针时调用
82 -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
83 {
84     NSLog(@"取消选中%@", [view.annotation title]);
85 }
86 }

地图与定位(LBS)-MapKit篇相关推荐

  1. 地图与定位(一)定位服务

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

  2. 地图与定位之大头针视图

    该博文在上一博文地图与定位之地图.大头针的基础上完成. 在MyAnnotation.h 中增加属性 #import <Foundation/Foundation.h> #import &l ...

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

    来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功 ...

  4. android百度地图sdk定位权限,Android:使用百度地图SDK实现定位:下载SDK、申请密钥、动态获得Android权限...

    最近想实现一个打卡的功能,想到可以利用百度地图的SDK.网上有很多关于百度地图SDK定位.地图功能应用的demo,这部分倒不是很困难.但网上很多博客写的内容一般都着重于代码部分,很多下载配置和编译器设 ...

  5. iOS学习笔记19 地图(一)定位CoreLocation

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

  6. iOS开发--地图与定位

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

  7. Android 集成高德地图——当前定位,添加图标,画路线,设置显示中心位置,比例,地图刷新位置监听,判断GPS开启,去打开GPS

    /*** 判断定位服务是否开启** @param* @return true 表示开启*/ public static boolean isLocationEnabled(Context contex ...

  8. 微信小程序如何调用腾讯地图进行定位的简单方法

    前言: 这是博主自己目前使用的方式,比较方便,直接调用,没有任何花里胡哨的操作,简约 简单,基于官方文档的说明可以很清楚的知道如何调用腾讯地图的api 具体操作如下 : 先在腾讯地图开放文档中获取到官 ...

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

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

  10. echarts关系图/力导向动态图(地图经纬度定位)

    需求:项目要做一个动态展示服务器前置机间是否连通的界面. 先看下效果,分两种,一种带地图(经纬度),一种屏蔽地图显示: 这个是通过百度echarts的一个案列改造而来.下面附上官网地址.API地址.改 ...

最新文章

  1. python方法调用名字不一样_python中调用父类同名方法
  2. Google App Engine(GAE)入门教程翻译
  3. 算法笔记之回溯法(2)
  4. Android 编译系统分析(三)
  5. 数据库原理 知识点总结
  6. 计算机与人力资源管理论文,计算机专业毕业论文-人力资源管理系统的研究与实现...
  7. java integer valueof_一文读懂什么是Java中的自动拆装箱
  8. 快了!CVPR 2019 所有录用论文题目列表刊出,即将开放下载!
  9. zabbix通过钉钉报警
  10. 字体大小自适应屏幕分辨率 CSS解决方案
  11. php 删除最后一个空数组,php删除空数组
  12. io.js入门(三)—— 所支持的ES6(下)
  13. 用户名 不在 sudoers 文件中。此事将被报告。
  14. Kotlin工程项目下的不同的源文件图标
  15. 申请 iOS开发者计划 (IOS Developer Program IDP)
  16. c++获取系统时间实例2
  17. 抖音小店无货源去哪找货源?抖店最新整改代拍公告,新规速递
  18. 如何构建自己的python package
  19. 嵌入式软件测试的基本方法
  20. 命令行重启Mysql

热门文章

  1. PostgreSQL 常用工具
  2. c语言解除宏定义_C语言宏定义 define,及一些陷阱!
  3. Latex之添加删除线
  4. Linux下批量ping ip地址
  5. cmd控制台窗体大小设置
  6. UOJ 【UR #4】追击圣诞老人 题解
  7. DiskPart分区工具命令详解
  8. 奇怪的小鸭子也增加了
  9. 安卓 类微信界面开发(一)
  10. 简单之美——系统设计黄金法则